BMP085气压传感器驱动 &MS5611经验

2023-05-16

BMP085是新一代的小封装气压传感器,主要用于气压温度检测,在四轴飞行器上可以用作定高检测,该传感器属于IIC总线接口,依然沿用标准IIC驱动程序

   使用该传感器需要注意的是我们不能直接读出转换好的二进制温度数据或者气压数据,必须先读出一整套约176位的矫正数据,然后启动转换,将转换的数据与矫正数据一起进行矫正运算才能正常获得温度,温度精度为0.1,大气压有16bit或者19bit的精度,一般选择16位精度,

  所以对于该传感器设备,驱动模式如下

  1.获取矫正数据-->启动温度转换--->获取原始温度数据-->启动大气压转换-->获取原始大气压数据-->计算实际温度数据大气压数据

   另,转换时的转换时间也是计算时的重要参数,计算大气压时的过程中需要使用冤死温度


矫正数据如下


矫正数据都是16位有符号的,所以读出的时候需要连续读取两个字节

通过计算得到的大气压强可以计算得到当前传感器相对于海平面的绝对高度



具体驱动代码如下所示

[cpp]  view plain  copy
  1. #ifndef __BMP085_H_  
  2. #define __BMP085_H_  
  3. #include "ioremap.h"  
  4. #include "common.h"  
  5. #include "stm32f10x.h"  
  6. #include "uart.h"  
  7. #include "delay.h"  
  8.   
  9. //BMP SDA PC0  
  10. //BMP SCL PC1  
  11.   
  12. #define BMP_ACK_WAIT_TIME   200     //iic通讯时的ack等待时间  
  13.   
  14. #define BMP085_DEBUG    1  
  15.   
  16. #define OSS 0   // 大气压的转换时间,有0-3可选值  
  17.   
  18. //地址均为读地址  
  19. #define BMP085_ADDR     0xEE      //定义器件在IIC总线中的写地址   
  20.   
  21. #define BMP_AC1_ADDR        0XAA      //定义校准寄存器的地址  
  22. #define BMP_AC2_ADDR        0XAC  
  23. #define BMP_AC3_ADDR        0XAE  
  24. #define BMP_AC4_ADDR        0XB0  
  25. #define BMP_AC5_ADDR        0XB2  
  26. #define BMP_AC6_ADDR        0XB4  
  27. #define BMP_B1_ADDR         0XB6  
  28. #define BMP_B2_ADDR         0XB8  
  29. #define BMP_MB_ADDR         0XBA  
  30. #define BMP_MC_ADDR         0XBC  
  31. #define BMP_MD_ADDR         0XBE  
  32.   
  33. #define CONTROL_REG_ADDR    0XF4    //控制寄存器,在这个寄存器中设置不同的值可以设置不同转换时间,同时不同的值可以确认转换大气压或者温度  
  34. #define BMP_COVERT_TEMP     0X2E    //转换温度 4.5MS  
  35. #define BMP_COVERT_PRES_0   0X34    //转换大气压 4.5ms  
  36. #define BMP_COVERT_PRES_1   0X74    //转换大气压 7.5ms  
  37. #define BMP_COVERT_PRES_2   0XB4    //转换大气压 13.5ms  
  38. #define BMP_COVERT_PRES_3   0XF4    //转换大气压 25.5ms  
  39.   
  40. #define BMP_TEMP_PRES_DATA_REG  0XF6    //两个字节温度数据  
  41.   
  42. //0xf6 0xf7 0xf8 压强地址  
  43. //0xf6 0xf7 温度地址  
  44.   
  45. typedef struct BMP085PARAM //校准参数表  
  46. {  
  47.   s16 ac1;  
  48.   s16 ac2;  
  49.   s16 ac3;  
  50.   u16 ac4;  
  51.   u16 ac5;  
  52.   u16 ac6;  
  53.   s16 b1;  
  54.   s16 b2;  
  55.   s16 mb;  
  56.   s16 mc;  
  57.   s16 md;  
  58. }BMP085PARAM;  
  59.   
  60.   
  61.   
  62. void BmpInit(void);         //接口与参数初始化  
  63.   
  64. //读取温度数据并校正转换  
  65. long BmpConvertTemp(void);  
  66.   
  67. //读取压强数据并校正转换  
  68. long BmpConvertPressure(void);  
  69.   
  70.   
  71.   
  72. #endif  

[cpp]  view plain  copy
  1. #include "bmp085.h"  
  2.   
  3. static struct BMP085PARAM bmp085ParamStruct = {0,0,0,0,0,0,0,0,0,0,0};  
  4.   
  5. //IO方向设置  
  6. #define BMP_SDA_IN()  {GPIOC->CRL&=0XFFFFFFF0;GPIOC->CRL|=8;}  
  7. #define BMP_SDA_OUT() {GPIOC->CRL&=0XFFFFFFF0;GPIOC->CRL|=3;}  
  8.   
  9. //IO操作函数       
  10. #define BMP_SCL    PCout(1) //SCL  
  11. #define BMP_SDA    PCout(0) //SDA      
  12. #define BMP_READ_SDA   PCin(0)  //输入SDA   
  13.   
  14. /**************************BMP5883 IIC驱动函数*********************************/  
  15.   
  16. static void BMP085IOInit(void)  
  17. {  
  18.     GPIO_InitTypeDef GPIO_InitStructure;  
  19.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE );   
  20.       
  21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;  
  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出  
  23.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  24.     GPIO_Init(GPIOC, &GPIO_InitStructure);  
  25.       
  26.     BMP_SCL = 1;  
  27.     BMP_SDA = 1;  
  28. }  
  29.   
  30.   
  31.   
  32. //发送IIC起始信号  
  33. static void ComStart(void)  
  34. {  
  35.     BMP_SDA_OUT();     //sda线输出  
  36.     BMP_SDA=1;          
  37.     BMP_SCL=1;  
  38.     DelayUs(5);  
  39.     BMP_SDA=0;//START:when CLK is high,DATA change form high to low   
  40.     DelayUs(5);  
  41.     BMP_SCL=0;//钳住I2C总线,准备发送或接收数据  
  42. }  
  43. //发送IIC停止信号  
  44. static void ComStop(void)  
  45. {  
  46.     BMP_SDA_OUT();//sda线输出  
  47.     BMP_SDA=0;//STOP:when CLK is high DATA change form low to high  
  48.     BMP_SCL=1;  
  49.     DelayUs(5);  
  50.     BMP_SDA=1;//发送I2C总线结束信号  
  51.     DelayUs(5);       
  52. }  
  53. //等待ACK,为1代表无ACK 为0代表等到了ACK  
  54. static u8 ComWaitAck(void)  
  55. {  
  56.     u8 waitTime = 0;  
  57.     BMP_SDA_OUT();//sda线输出  
  58.     BMP_SDA = 1;  
  59.     DelayUs(5);  
  60.     BMP_SDA_IN();      //SDA设置为输入  
  61.     BMP_SCL=1;  
  62.     DelayUs(5);  
  63.     while(BMP_READ_SDA)  
  64.     {  
  65.         waitTime++;  
  66.         DelayUs(1);  
  67.         if(waitTime > BMP_ACK_WAIT_TIME)  
  68.         {  
  69.             ComStop();  
  70.             return 1;  
  71.         }  
  72.     }  
  73.     BMP_SCL = 0;  
  74.     return 0;  
  75.       
  76. }  
  77.   
  78. static void ComSendAck(void)  
  79. {  
  80.     BMP_SCL = 0;  
  81.     BMP_SDA_OUT();  
  82.     BMP_SDA = 0;  
  83.     DelayUs(2);  
  84.     BMP_SCL = 1;  
  85.     DelayUs(5);  
  86.     BMP_SCL = 0;  
  87.     DelayUs(5);  
  88. }  
  89.   
  90. static void ComSendNoAck(void)  
  91. {  
  92.     BMP_SCL = 0;  
  93.     BMP_SDA_OUT();  
  94.     BMP_SDA = 1;  
  95.     DelayUs(2);  
  96.     BMP_SCL = 1;  
  97.     DelayUs(5);  
  98.     BMP_SCL = 0;  
  99.     DelayUs(5);  
  100. }  
  101. //返回0 写入收到ACK 返回1写入未收到ACK  
  102. static u8 ComSendByte(u8 byte)  
  103. {  
  104.     u8 t;     
  105.     BMP_SDA_OUT();    
  106.     for(t=0;t<8;t++)  
  107.     {                
  108.         BMP_SDA=(byte&0x80)>>7;  
  109.         byte<<=1;          
  110.         BMP_SCL=1;  
  111.         DelayUs(5);   
  112.         BMP_SCL=0;    
  113.         DelayUs(5);  
  114.     }      
  115.     return ComWaitAck();  
  116. }  
  117.   
  118. static void ComReadByte(u8* byte)  
  119. {  
  120.     u8 i,receive=0;  
  121.     BMP_SDA_IN();//SDA设置为输入  
  122.     for(i=0;i<8;i++ )  
  123.     {  
  124.         receive <<= 1;  
  125.         BMP_SCL=1;   
  126.         DelayUs(5);  
  127.         if(BMP_READ_SDA)receive++;  
  128.         BMP_SCL=0;   
  129.         DelayUs(5);   
  130.     }                       
  131.     *byte = receive;  
  132. }  
  133.   
  134. /**************************BMP5883 IIC驱动函数*********************************/  
  135.   
  136. //**************************************  
  137. //向I2C设备写入一个字节数据  
  138. //**************************************  
  139. u8 BmpWriteByte(u8 addr,u8 dataValue)  
  140. {  
  141.     u8 res = 0;  
  142.     ComStart();                  //起始信号  
  143.     res = ComSendByte(BMP085_ADDR);   //发送设备地址+写信号  
  144.     if(res)  
  145.     {  
  146.         #ifdef BMP085_DEBUG  
  147.         printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);  
  148.         #endif  
  149.         return res;  
  150.     }  
  151.     res = ComSendByte(addr);    //内部寄存器地址,  
  152.     if(res)  
  153.     {  
  154.         #ifdef BMP085_DEBUG  
  155.         printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);  
  156.         #endif  
  157.         return res;  
  158.     }  
  159.     res = ComSendByte(dataValue);       //内部寄存器数据,  
  160.     if(res)  
  161.     {  
  162.         #ifdef BMP085_DEBUG  
  163.         printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);  
  164.         #endif  
  165.         return res;  
  166.     }  
  167.     ComStop();                   //发送停止信号  
  168.     return 0;  
  169. }  
  170.   
  171. //**************************************  
  172. //从I2C设备读取一个字节数据  
  173. //**************************************  
  174. u8  BmpReadByte(u8 addr,u8* data)   //读取一个字节  
  175. {  
  176.     u8 REG_data,res = 0;  
  177.     ComStart();                   //起始信号  
  178.     res = ComSendByte(BMP085_ADDR);    //发送设备地址+写信号  
  179.     if(res)  
  180.     {  
  181.         #ifdef BMP085_DEBUG  
  182.         printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);  
  183.         #endif  
  184.         return res;  
  185.     }  
  186.     res = ComSendByte(addr);     //发送存储单元地址,从0开始  
  187.     if(res)  
  188.     {  
  189.         #ifdef BMP085_DEBUG  
  190.         printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);  
  191.         #endif  
  192.         return res;  
  193.     }     
  194.     ComStart();                   //起始信号  
  195.     res = ComSendByte(BMP085_ADDR+1);  //发送设备地址+读信号  
  196.     if(res)  
  197.     {  
  198.         #ifdef BMP085_DEBUG  
  199.         printf("file=%s,func=%s,line=%d\r\n",__FILE__,__FUNCTION__,__LINE__);  
  200.         #endif  
  201.         return res;  
  202.     }  
  203.     ComReadByte(®_data);       //读出寄存器数据  
  204.     ComSendNoAck();                //接收应答信号  
  205.     ComStop();                    //停止信号  
  206.     *data = REG_data;  
  207.     return 0;  
  208. }  
  209.   
  210. s16 BmpReadTwoByte(u8 addr)     //读出BMP085内部数据,连续两个  
  211. {  
  212.   u8 msb, lsb;  
  213.   short dataValue;  
  214.   BmpReadByte(addr,&msb);  
  215.   BmpReadByte(addr + 1,&lsb);  
  216.   dataValue = ((short)msb)<<8;  
  217.   dataValue |= lsb;  
  218.   return dataValue;  
  219. }  
  220.   
  221.   
  222. //获取校正参数,读出十一个字的校准系数**************  
  223. void BmpGetParam(BMP085PARAM* bmpParam)  
  224. {  
  225.    bmpParam->ac1 = BmpReadTwoByte(BMP_AC1_ADDR);  
  226.    bmpParam->ac2 = BmpReadTwoByte(BMP_AC2_ADDR);  
  227.    bmpParam->ac3 = BmpReadTwoByte(BMP_AC3_ADDR);  
  228.    bmpParam->ac4 = BmpReadTwoByte(BMP_AC4_ADDR);  
  229.    bmpParam->ac5 = BmpReadTwoByte(BMP_AC5_ADDR);  
  230.    bmpParam->ac6 = BmpReadTwoByte(BMP_AC6_ADDR);  
  231.    bmpParam->b1 = BmpReadTwoByte(BMP_B1_ADDR);  
  232.    bmpParam->b2 = BmpReadTwoByte(BMP_B2_ADDR);  
  233.    bmpParam->mb = BmpReadTwoByte(BMP_MB_ADDR);  
  234.    bmpParam->mc = BmpReadTwoByte(BMP_MC_ADDR);  
  235.    bmpParam->md = BmpReadTwoByte(BMP_MD_ADDR);  
  236. }  
  237.   
  238. void BmpInit(void)          //接口与参数初始化  
  239. {  
  240.   BMP085IOInit();  
  241.   BmpGetParam(&bmp085ParamStruct);  
  242. }  
  243.   
  244. //读取温度数据(未经过校正的)  
  245. s32 BmpReadTemp(void)             
  246. {  
  247.   BmpWriteByte(CONTROL_REG_ADDR,BMP_COVERT_TEMP);   //启动温度转换  
  248.   DelayMs(5);                   //等待转换完成,最大转换4.5MS  
  249.   return (s32)BmpReadTwoByte(BMP_TEMP_PRES_DATA_REG);   //返回温度数据  
  250. }  
  251.   
  252. //读取压强数据未校正  
  253. s32 Bmp085ReadPressure(void)      
  254. {  
  255.   s32 pressure = 0;  
  256.   BmpWriteByte(CONTROL_REG_ADDR,BMP_COVERT_PRES_0); //启动温度转换  
  257.   DelayMs(10);                  //等待转换完成,最大转换4.5MS,所以换算的时候要用OSS=0  
  258.   pressure =  (s32)BmpReadTwoByte(BMP_TEMP_PRES_DATA_REG);  //返回压力数据,默认使用16字节压力数据  
  259.   pressure &= 0x0000FFFF;  
  260.   return pressure;  
  261. }  
  262.   
  263. //读取温度数据并校正转换  
  264. long BmpConvertTemp(void)  
  265. {  
  266.   u32 ut;  
  267.   long x1, x2, b5;   
  268.   long  temperature;  
  269.     
  270.   ut = BmpReadTemp();      // 读取温度  
  271.   x1 = (((long)ut - (long)bmp085ParamStruct.ac6)*(long)bmp085ParamStruct.ac5) >> 15;  
  272.   x2 = ((long) bmp085ParamStruct.mc << 11) / (x1 + bmp085ParamStruct.md);  
  273.   b5 = x1 + x2;  
  274.   temperature = ((b5 + 8) >> 4);  //温度计算,官方公式  
  275.   #ifdef BMP085_DEBUG  
  276.   printf("bmp085 temp is %f 'C\r\n",((float)temperature)/10.0);  
  277.   #endif  
  278.   return temperature;  
  279. }  
  280.   
  281. //读取压强数据并校正转换  
  282. long BmpConvertPressure(void)  
  283. {  
  284.   unsigned int ut;  
  285.   unsigned long up;  
  286.   long x1, x2, b5, b6, x3, b3, p;  
  287.   unsigned long b4, b7;  
  288.   long  pressure;  
  289.     
  290.   ut = BmpReadTemp();      // 读取温度,计算压强时需要温度做参数  
  291.   up = Bmp085ReadPressure();  // 读取压强  
  292.     
  293.   x1 = (((long)ut - (long)bmp085ParamStruct.ac6)*(long)bmp085ParamStruct.ac5) >> 15;  
  294.   x2 = ((long)bmp085ParamStruct.mc << 11) / (x1 + bmp085ParamStruct.md);  
  295.   b5 = x1 + x2;  
  296.     
  297.   b6 = b5 - 4000;  
  298.   // Calculate B3  
  299.   x1 = (bmp085ParamStruct.b2 * (b6 * b6)>>12)>>11;  
  300.   x2 = (bmp085ParamStruct.ac2 * b6)>>11;  
  301.   x3 = x1 + x2;  
  302.   b3 = (((((long)bmp085ParamStruct.ac1)*4 + x3)<<OSS) + 2)>>2;  
  303.     
  304.   // Calculate B4  
  305.   x1 = (bmp085ParamStruct.ac3 * b6)>>13;  
  306.   x2 = (bmp085ParamStruct.b1 * ((b6 * b6)>>12))>>16;  
  307.   x3 = ((x1 + x2) + 2)>>2;  
  308.   b4 = (bmp085ParamStruct.ac4 * (unsigned long)(x3 + 32768))>>15;  
  309.     
  310.   b7 = ((unsigned long)(up - b3) * (50000>>OSS));  
  311.   if (b7 < 0x80000000)  
  312.     p = (b7<<1)/b4;  
  313.   else  
  314.     p = (b7/b4)<<1;  
  315.     
  316.   x1 = (p>>8) * (p>>8);  
  317.   x1 = (x1 * 3038)>>16;  
  318.   x2 = (-7357 * p)>>16;  
  319.   pressure = p+((x1 + x2 + 3791)>>4);  
  320.     
  321.   #ifdef BMP085_DEBUG  
  322.   printf("bmp085 pressure is %f KPa\r\n",((float)pressure)/1000.0);  
  323.   #endif  
  324.   return pressure;  
【经验交流】使用MS5611高精度气压计之后的感想
http://bbs.elecfans.com/jishu_469008_1_1.html
(出处: 中国电子技术论坛)
  1. 【经验交流】使用MS5611高精度气压计之后的感想 :【经验交流】使用MS5611高精度气压计之后的感想
    http://bbs.elecfans.com/jishu_469008_1_1.html
    (出处: 中国电子技术论坛)
  2.   我是在房间内测试MS5611的,模块一直放着不动,然后,通过stm32读取芯片内存储气压值(用其他芯片读取没试过,但应该没有影响)。最后发现,读数据的频率非常影响气压的值,或者是温度的值。这里我已经考虑到了传感器芯片内部做AD转换的时间了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BMP085气压传感器驱动 &MS5611经验 的相关文章

  • 飞控学习常见典型问题集Q&A——无名创新(2022年4月15日)

    飞控学习常见典型问题集Q amp A 无名创新 xff08 2022年4月15日 xff09 1 第一次启动FS I6遥控器 xff0c 进入不了界面一直嘟嘟 xff0c 请问这是什么情况呢 xff1f 先把上面的英文翻译一下 xff0c
  • VFH & VFH+ & VFH*—— Path Planning

    版权声明 xff1a 本文为博主原创博文 xff0c 未经允许不得转载 xff0c 若要转载 xff0c 请说明出处并给出博文链接 最近在学习VFH算法 xff0c 感觉蛮神奇 xff0c 特意从维基百科扒来了资料 xff0c 供学习研究
  • 虚拟化技术介绍 & hypervisor简介

    什么是虚拟化 xff1f 虚拟化 xff08 英语 xff1a Virtualization xff09 是一种资源管理技术 xff0c 是将计算机的各种实体资源 xff0c 如服务器 网络 内存及存储等 xff0c 予以抽象 转换后呈现出
  • OpenGL进阶 | GLM数学库& Shader相关

    一 GLM数学库 OpenGL和DirextX不一样 xff0c 没有内置的数学库 xff0c 于是我们需要找一个第三方数学库来完成OpenGL相关的数学计算 GLM库是一个为OpenGL准备的数学库 xff0c 它提供了各种数学运算的函数
  • ORB-SLAM3测试:数据集(单目/双目/imu)& ROS (D435 T265)

    ORB SLAM3环境配置 安装各种依赖库 orb slam3非常友好 xff0c 不用自己下载各种依赖库 xff0c 因为他们全部在thirdParty文件夹中 xff0c 编译orb slam3的同时会自动编译各种依赖库 Eigen3
  • (5)py接口自动化之配置文件&数据库连接详解

    目录 一 配置文件 ini amp yaml 1 作用 2 ini A 语法 B 特点 C 操作方法 3 yaml A 安装第三方库 B 支持的数据类型 C 特性 D 语法 E 数据读取 二 数据库连接与pytho配置文件 1 安装数据库
  • 数组名a+1和&a+1的区别

    C C 43 43 里面的数组名字会退化为指针 xff0c 所以数组名a实际指的是数组的第一个元素的地址 而数组名作为指针来讲有特殊性 xff0c 它正在它所指向的内存区域中 xff0c amp a的值和a的数值是相同的 xff08 可以输
  • TCP Server&Client socket实现(Ubuntu16.04)

    TCP Server amp Client socket实现 xff08 Ubuntu16 04 xff09 1 测试 xff1a 2 TCP Server3 TCP Client 1 测试 xff1a 2 TCP Server span
  • Jetson xavier Nx & jetson nano 上手 + 刷机

    本教程基于Jetson xavier Nx开发套件 本教程参考Nvidia官方刷机教程 制作启动盘 在官方下载中心下载SD卡镜像并解压 下载SD Memory Card Formatter 需要划到页面最下方 xff0c 点击 Accept
  • MS5611气压传感器中文资料

    MS5611是新一代高分辨率气压传感器 xff0c 分辨率可达10cm 其内置24位AD转换器 xff0c 支持IIC和SPI通讯协议 xff0c 传输速率可达20MHz 其转换时间可以设置 测量 工作范围 xff1a 10 1200mba
  • C++中vector作为参数的三种传参方式(传值 && 传引用 && 传指针)

    c 43 43 中常用的vector容器作为参数时 xff0c 有三种传参方式 xff0c 分别如下 xff1a function1 vector vec xff0c 传值 function2 vector amp vec xff0c 传引
  • 无人机拉力测试台研制&测试过程中的9个关键技术点

    随着近年来无人机行业的飞速迭代发展 xff0c 越来越多的相关从业人员选择使用拉力测试台来测试并优化无人机的动力系统 xff0c 本文尝试从无人机拉力测试台的研制和使用角度来阐述无人机拉力测试中的9个关键技术点 1 电磁干扰方面的考虑 测试
  • STM32&nbsp;HAL库&nbsp;STM3…

    原文地址 xff1a STM32 HAL库 STM32CUBEMX KEIL TIM1 PWM 四路输出可调 一 作者 xff1a 用户2797410335 硬件 xff1a TM32F407VET6 8M晶振 xff0c JLINK JT
  • ROS速成之发送&接收消息

    人真的老了 xff0c 扔了个周末 xff0c 完全不记得干了什么 论纪录的重要性啊 xff0c 当时觉得明白的很 xff0c 你扔两天试试 xff1f 扔一年试试 xff1f 扔几年试试 xff1f 最近参加的各种项目脑疼眼乏 xff0c
  • n&(1<<i)用法

    1 lt lt i 是将1左移i位 xff0c 即第i位为1 xff0c 其余位为0 xff1b 例如1 lt lt 2 则0001 gt 0100 n amp 1 lt lt i 是将左移i位的1与n进行按位与 xff0c 即为保留n的第
  • 最简单的 DRM 应用 & drm设备不工作

    https zhuanlan zhihu com p 341895843 https zhuanlan zhihu com p 75321245 编写最简单的 DRM 应用 主程序 xff1a int main int argc char
  • Flask-SQLAlchemy 中的 relationship & backref

    今天重看 Flask 时 xff0c 发现对backref仍然没有理解透彻 查阅文档后发现 xff0c 以前试图孤立地理解backref是问题之源 xff0c backref是与relationship配合使用的 一对多关系 db rela
  • linux中断&poll&selcet按键处理机制

    在上一篇linux按键中断处理中 xff0c 我们采用按键中断处理获取按键 xff0c 在read函数中阻塞读取 xff0c 当按键发生时 xff0c read自动解除阻塞 xff0c 实现应用层读取到相应的按键值 在上一节中如果没有按键到
  • Cmake入门&运行保存C/C++文件

    Cmake入门 amp 运行保存C C 43 43 文件 在ubuntu创建 保存 运行c 43 43 文件CMake入门创建文件编译 参考 最近在学习Intel realsense T265双目视觉 xff0c 其中一步需要创建源文件ma
  • STM32F407单片机移植MS5611气压计(基于IIC)---同时解决温度低于20度时计算得到的大气压错误的问题

    最近一个工程项目需要使用MS5611气压计 就花时间研究了一下 发现网上很多都是基于STM32F103单片机的MS5611气压计源程序 当移植到STM32F407时发现采集的大气压力和温度值不对 同时发现网上部分程序在温度高于20度时 计算

随机推荐

  • MySQL 5.7数据库参数优化

    连接相关参数 max connections xff1a 允许客户端并发连接的最大数量 xff0c 默认值是151 xff0c 一般将该参数设置为500 2000 max connect errors xff1a 如果客户端尝试连接的错误数
  • SpringCloud使用nacos做配置中心,不生效,没有作用

    问题描述 xff1a 一直使用nacos做注册中心 xff0c 配置还是使用的配置文件 将配置文件整理到nacos以后 xff0c 却发现一直不生效 xff0c 看网上大部分说是版本依赖不兼容的问题 xff0c 修改版本依赖关系 尝试降版本
  • js把字符串(yyyymmdd)转换成日期格式(yyyy-mm-dd)

    1 var r 61 34 20112233 34 replace d 4 d 2 d 2 34 1 2 3 34 console log r 2 var dateString 61 39 19930701 39 var pattern 6
  • 转:分享 OS X 10.7-10.11 最终版镜像,DMG 格式

    1 黑白果通用版本 1 1 版本列表 以下 10 7 10 11 五个版本都是黑白果通用的 xff0c 已经替换过内核 xff0c 默认匹配变色龙 xff0c 通用驱动和配置在根目录 Extra 文件夹下 xff0c 文件后面有 MBR 的
  • DrawText函数的讲解

    函数原型 int DrawText HDC hDC 设备描述表句柄 LPCTSTR lpString 将要绘制的字符串 int nCount 字符串的长度 LPRECT lpRect 指向矩形结构RECT的指针 UINT uFormat 正
  • js获取上个月最后一天 上个月第一天

    获取上个月第一天 var firstdate 61 new Date new Date getFullYear new Date getMonth 1 1 获取上个月最后一天 var date 61 new Date var day 61
  • opencv3颜色识别(C++)

    文章目录 opencv3颜色识别 C 43 43 目标思路1 读取图像2 对比度调整 xff08 直方图均衡 xff09 3 RGB颜色分类4 形态学去噪声 代码结果参考 opencv3颜色识别 C 43 43 目标 给定一幅图像 xff0
  • 安卓串口调试记录(包括串口通信底层知识点)

    一 有关串口通信基本知识 有关波特率计算 xff08 参考链接 xff09 第一个字节的10位 xff08 1位起始位 0 xff0c 8位数据位和1位停止位 1 xff09 共占约1 05ms xff0c 这样可计算出其波特率约为 xff
  • Android通过jni调用本地c/c++接口方法总结

    网上有网友问android的原生应用 xff0c 上层java代码如何通过jni调用本地的c c 43 43 接口或第三方动态库 xff1f 之前搞过android应用开发和底层c c 43 43 接口开发都是一个人搞定 xff0c 觉得还
  • fastadmin使用fast\Http 发送post/get/patch等请求,参数为二维数组时候报错,怎么解决?

    之前受邀回答了这么一个问题 xff1a 在后端发请求时 xff0c 如果参数里面是数组 xff0c 就会报错 34 Array to string conversion 34 xff0c 大概意思就是数组转字符串的时候出错了 先说解决方法
  • 【单片机笔记】PWM信号与PPM信号简单理解

    PPM信号是航模遥控器输出的一种标准信号 xff0c 从PPM信号中可以获取7 9个通道的遥控指令数据 PPM看起来很像PWM xff0c 很多模型爱好者对于它们产生了误解 xff0c 有些朋友认为PPM和PWM就是一回事 xff0c 其实
  • /etc/init.d/rcS 导致无法进入系统

    使用putty 和 pscp 自制了一个生产脚本 xff0c 脚本中从windows复制程序和启动文件至linux系统中 xff0c 系统重启后 xff0c 提示如下信息 xff0c 找不到 etc init d rcS文件 can spa
  • C语言实现linux环境UDP协议接收发送数据

    C语言实现linux环境UDP协议接收发送数据 说明上代码运行结果 说明 闲来无事 xff0c 写了个C语言的UDP小程序 xff0c 程序新建了两个线程 xff0c 分别用来实现UDP数据到发送和接收 需要的直接拿去用 上代码 inclu
  • 【随问】网址中的www是什么意思?HTTPS和HTTP的区别是什么?

    一旦某个单位拥有了一个域名 xff0c 它就可以自己决定是否要进一步划分其下属的子域而不需要上级结构批准 所以 xff0c 当一个单位申请到一个域名后 xff0c 如腾讯申请了一个qq com xff0c 他就可以自己划分子域 这里就出现了
  • HTTP身份认证

    文章目录 HTTP身份认证概述BASIC认证DIGEST认证SSL客户端认证基于表单认证 HTTP身份认证 概述 某些Web页面只想让特定的人浏览 xff0c 或者仅本人可见 xff0c 未达到这个目标 xff0c 必不可少的就是认证功能
  • 不应该不知道C++的常用库

    非常惭愧 xff0c 我过去也仅仅了解boost STLport这样的库 xff0c 以及一些GUI库 xff0c 但是居然有如此众多的C xff0b xff0b 库 xff0c 其实令我惊讶 当然 xff0c 这个问题应该辩证的看 xff
  • Nginx配置完毕后不准发请求头header的解决办法

    目前项目架构是vue 43 springboot前后端分离的 xff0c 前端部署在nginx上 xff0c 后端启动接口服务 xff0c 并用nginx进行反向代理 部署完毕后 xff0c 后端就是怎么收取不到shiro的header中的
  • Win10问题篇:解决AMD家CPU机械,固态硬盘混用导致的卡顿(爆音)问题。

    有的朋友使用AMD Cpu机械固态混用会有的卡顿问题 xff0c 卡顿包括 爆音 xff0c 硬盘占用突然100 xff0c 游戏卡屏 我冷静分析加百度 xff0c 是IDE ATA ATAPI控制器驱动不一致导致 xff0c 换成一样的驱
  • ARM 搭建开源NAS平台

    最近用闲置的电脑配件装了台黑群晖 xff0c 从使用角度以及省电方面考虑 xff0c 个人认为ARM架构的NAS平台相较于X86更加省电 xff0c 正好手里有一块之前调试全志T3平台闲置下来的开发板 xff0c 开发板上正好有个SATA接
  • BMP085气压传感器驱动 &MS5611经验

    BMP085是新一代的小封装气压传感器 主要用于气压温度检测 在四轴飞行器上可以用作定高检测 该传感器属于IIC总线接口 依然沿用标准IIC驱动程序 使用该传感器需要注意的是我们不能直接读出转换好的二进制温度数据或者气压数据 必须先读出一整