文章目录如何用串口读取维特陀螺仪jy61p的数据?一、摘要二、c语言数据类型1、stdint关键字的含义2、数据范围是一个首尾相接的环形3、程序员计算器介绍4、数据类型强制转换三、WIT私有协议1.寻找数据包2.解读数据包3.解读数据包的坑四、代码解析与实操1、陀螺仪上位机配置2、stm32串口初始化3、接收数据包进行数据处理4、OLED显示5、效果展示五、源码链接如何用串口读取维特陀螺仪jy61p的数据?一、摘要经常做小车的朋友一定知道,采用mpu6050的DMP姿态解算Yaw轴的零点漂移非常严重,为此有两种解决方法,一种是写一个强大的滤波算法(如卡尔曼滤波),另一种是直接换一个更diao的陀螺仪。本人采用第二种方法,使用维特智能科技的陀螺仪jy61p,效果很好,就是有点小贵。该陀螺仪采用串口通信,也不会像IIC那样经常发癫。由于官方给的例程功能太过强大,移植比较麻烦,所以我查阅资料写了个易移植的代码。采用串口接收数据包的方法读取陀螺仪数据,主要有两件事:串口接收数据包和数据类型的转换。二、c语言数据类型以下是C语言的数据类型,陀螺仪的原始数据为16位并且拆成高字节和低字节,也就是uint8_t,我们需要把他转化成int16_t或uint16_t才能合并,正常使用进行计算。具体操作在后面讲,这里需要先了解一下c语言数据类型的转换应该避的一些坑。1、stdint关键字的含义打开stdint.h可以看到如下定义:/* exact-width signed integer types */typedefsignedcharint8_t;typedefsignedshortintint16_t;typedefsignedintint32_t;typedefsigned__INT64int64_t;/* exact-width unsigned integer types */typedefunsignedcharuint8_t;typedefunsignedshortintuint16_t;typedefunsignedintuint32_t;typedefunsigned__INT64uint64_t;可以看出stdint关键字基本都是(u)intx_t的形式,x为位数,这个数是怎么来的呢?比如说uint8_t,用二进制表示八位数,每位只能是0或1,进行排列组合共有28种情况,正好就是256,所以最多表示256个数,如果有符号(即int8_t)那就需要首位表示符号,剩余7位表示数的大小,27也就是256除以2就是128,所以可以表示范围-128~127。2、数据范围是一个首尾相接的环形比如说short类型(int16_t)表示的范围是-32768~+32767,但是当计数到32767后再加一结果是-32768如图:可以在c语言环境下运行如下代码:#includestdio.h#includestdint.hintmain(void){int16_ta=32768;printf("a=%d\n",a);return0;}可以看到运行结果是-32768:usigned short类型(uint16_t)表示的范围是0~65535,当计数到65535后再加一后会变成0如图:#includestdio.h#includestdint.hintmain(void){uint16_ta=65536;printf("a=%d\n",a);return0;}结果为0:3、程序员计算器介绍打开电脑计算器,切换到程序员模式:HEX: 十六进制 HexadecimalDEC :十进制 DecimalOCT :八进制 OctalBIN :二进制 BinaryMC(Memory Clear):清除存储器中的数值。MR(Memory Read):将存于存储器中的数显示在计算器的显示框上。MS(Memory Storage):将显示框的数值存于存储器中。如果存储器中有数值将会显示M标志。M+:将显示框的数与存储器中的数相加并进行存储。BIT(位): 是计算机内部数据储存的最小单位BYTE(字节): 八个比特 (bit) 称为一个字节,是计算机中数据处理的最基本的单位WORD(字): 两个字节称为一个字, 即16位DWORD:(双字) 两个字称为一个双字,两个Word,为32位 D为doubleQWORD(四字): 两个双字称为一个四字,四个Word,为64位 Q为 quadra4、数据类型强制转换将int16_t强制转换为uint16_t,运行如下代码:#includestdio.h#includestdint.hintmain(void){int16_ta=-50;printf("a=%d\n",a);uint16_tb;b=(uint16_t)a;