在开头先向大家说一声中秋节快乐呐~ 辛苦了很久终于能休息一下
我的问题是这样的,比赛要求是做一个车,他在周围有挡板的密闭环境里通过我放置的激光传感器定位,到达特定的位置,实现特定的功能。
现在编写程序能通过串口发送激活激光传感器的通信协议,但是我搞不懂怎么接受传感器发回来的距离数据,这个距离数据感觉有点奇奇怪怪的
是这样的:97 80 06 3F 30 32 2E 34 35 37(十六进制的数组) 真实的含义是02.457米
我测了多组参数 自己分析了一下 感觉应该是3F后的两组数是距离的个位与十位 而2E后面的是小数点后的数字 每个数字需要把数组中的3去掉。
我想请教一下各位这个数据处理函数应该怎么写?还有这个函数应该怎么用,我应该怎么读出他来,在Main函数判定?
请教大家一下,第一次用32还在学,希望大家带带路,谢谢啦。
你说的对,因为 '0' 的ascii 是 0x30,'1'的ascii 是0x31 ...
所以存在ascii -> number 为 - 30h 的规律,也就是你说的 -3
小数点的ascii 是0x2e
这是ascii表,http://ascii.911cha.com
看看数据手册 应该有协议的具体讲解
数据处理的话先用串口接收中断接收数据到一个 (buf)数组中
接收完全部数据就计算(可以设置一个标志位判断是否接收完毕)
计算可以在主函数中 也可以直接就在中断函数中计算(数据量不太大的话)
具体就像楼上说的 这个数据处理并不难 关键就是根据其通讯协议进行数据处理
97 80 06 3F 30 32 2E 34 35 37 翻译成ASCII是 梹?02.457 文字编码部分 是大五码,可以不需要去管,扔掉返回数组的前4,然后用2E(小数点)分割,前面的是整数部分,后面的是小数部分。
2部分数据直接-30,即可获得该二进制数据,然后分别从小数点位置向2边进行D0+D1*10+D2*100,获得整数,同样D-1*0.1+D-2*0.01......获得小数部分。
我的印象中3F是一个标志位,就是你接受到的第四个数据&0x1(或者别的为真,则表示接收到了一组测距数据),去掉3的话,直接减去0x30就可以了。测距的好像是IIC方式,这个器件有一个IIC方式的存储片的,先要对首地址发送0x1,然后再检测。
while(cnt<100)
{
_delay_ms(2);
val = read(add) //这个add为标志位地址
if(val&0x1) break;
cnt++;
}
//后面就可以用数据了
(我用的是vl53l0x测距的,格式是这样的,不知道你的是不是)