维特智能的JY901模块是一款高精度的姿态测量模块,能够测量被测物体的姿态角度,以欧拉角或者四元素的方式输出。 模块的数据采用16进制的方式进行传输,这种方式的优点是效率高,可以用很少的字节传输需要的数据,比如一个数据1.523,如果用16进制方式传送的话,2个字节就够了,而用ascii码的话,需要5个字节,在需要大量数据传输的时候就比较浪费有限的带宽了。而16进制数据的缺点呢,就是可读性不强,不像Ascii码那样,直接就能读出数据了。 16进制数据传输的原理是这样的,先要确定数据的表示范围,然后是每个数据可用的字节数。比如角度的数据,每个角度的数据范围是±180度,而2个字节16进制数的表示范围是-32767~32768之间,那么我们就把±180的数据映射到±32768之间。假设原理的数据是x,变换以后的数据是y,那么y=x/180*32768。2个字节能表示的最小精度是1/32768*180=0.0055°,这对于角度的精度来说也够用了。 下面具体讲解析的方法。 先通过串口调试助手看模块的原始数据,注意要选择好正确的波特率,并且将模块的显示模式勾选为16进制方式。如下图 如果能看到这种以55 51 或者55 52打头的数据,就说明接收到正确的数据了。 以加速度为例,加速度的数据是55 51 开头的数据包,比如上图圈选出来的数据是55 51 78 FD 4E 03 85 F8 FC 0E F3,根据厂家的说明文档,协议的规定是这样的 那么上述数据中,78 FD就是Ax的数据,4E 03就是Ay的数据,85 F8就是Az的数据 FC 0E是温度的数据, F3是校验和。以Ax的数据为例,AxL是78,AxH是FD,那么完整的16进制数据是FD78,转换我们需要使用到Windows的计算器。打开计算器以后,点击这里的标准
然后选择程序员,计算器进入程序员模式,再点击Hex,进入16进制模式。
接着就可以输入数据了,输入FD78,注意这里的WORD模式要调成WORD,这里是定义使用的字节数,如果选择错误将不能获得正确的结果
可以看到转换出来的结果是-648,然 后根据说明书给出的公司计算,得到Ax = -648/32768*16g=-0.316g。至此数据解析就完成了,同理可以算出Ay,Az和温度的数据。
如果使用单片机去解析数据,那么一定要注意数据的强制转换,先将高字节强制转换为有符号的short类型,然后再左移8位,然后再与低字节或,这样才能得到有正负符号的数据。
比如已经将找好包头的数据放置到ucRxBuffer这个数组里面了,然后就可以用下面的方法进行转换。 Ax = (((short)ucRxBuffer[3]<<8)|ucRxBuffer[2])/32768.0*16.0;
或者使用结构体内存拷贝的方法: 先定义一个加速度包的结构体 struct SAcc { short a[3]; short T; }; 再定义一个结构体对象 struct SAcc stcAcc; 再用内存拷贝将数据从ucRxBuffer[2]的地址拷贝到结构体中即可。 memcpy(&stcAcc,&ucRxBuffer[2],8); 这样得到的数据是具有符号的-32767~32768之间的数据,如果还需要将数据映射到加速度的量程范围 A[0]= stcAcc.a[0]/32768.0*16.0; 这样就获得了正确的加速度值。 同理可以获得角速度与角度数值。
|