文章目录
- 如何用串口读取维特陀螺仪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语言环境下运行如下代码:
#include<stdio.h>#include<stdint.h>intmain(void){int16_ta=32768;printf("a=%d\n",a);return0;}可以看到运行结果是-32768:
usigned short类型(uint16_t)表示的范围是0~65535,当计数到65535后再加一后会变成0
如图:
#include<stdio.h>#include<stdint.h>intmain(void){uint16_ta=65536;printf("a=%d\n",a);return0;}结果为0:
3、程序员计算器介绍
打开电脑计算器,切换到程序员模式:
HEX: 十六进制 Hexadecimal
DEC :十进制 Decimal
OCT :八进制 Octal
BIN :二进制 Binary
MC(Memory Clear):清除存储器中的数值。
MR(Memory Read):将存于存储器中的数显示在计算器的显示框上。
MS(Memory Storage):将显示框的数值存于存储器中。如果存储器中有数值将会显示M标志。
M+:将显示框的数与存储器中的数相加并进行存储。
BIT(位): 是计算机内部数据储存的最小单位
BYTE(字节): 八个比特 (bit) 称为一个字节,是计算机中数据处理的最基本的单位
WORD(字): 两个字节称为一个字, 即16位
DWORD:(双字) 两个字称为一个双字,两个Word,为32位 D为double
QWORD(四字): 两个双字称为一个四字,四个Word,为64位 Q为 quadra
4、数据类型强制转换
将int16_t强制转换为uint16_t,运行如下代码:
#include<stdio.h>#include<stdint.h>intmain(void){int16_ta=-50;printf("a=%d\n",a);uint16_tb;b=(uint16_t)a;