image.png2018年9月10日
/*
乱码记录
01 00 CC 00 00 03 E3
7F 01 12 01 00 C7 00 00 03 DE
原因是打印的时候出的%02X 问题,改成%03X 就好了
根本原始是没有延时
delay_ms(100); //超声波接受和处理字符需要延时
*/
实现功能:
串口先发送一段数据过去,然后返回一串数据,对数据首先进行分割,核对帧头帧尾,然后计算和校验,如果相等,就提取距离进行判断,后续为了提高准确率,可能多次后取平均值。
举例子:
- 读取站号1距离信息:
7F 01 12 00 00 00 00 00 03 16- 站号1返回距离信息:
7F 01 12 01 01 04 00 00 03 1c
/*
接受串口数据:
1. 直接读数据data0 ~ data3;
2. 校验帧头、和校验(帧尾参与计算), 再读数据data0 ~ data3;
3. 校验帧头、帧尾、和校验, 再读数据data0 ~ data3.
通讯在受到干扰的时候会乱码,本来是1接受方读到是0,或者本来是0接受方读到是1
串口通讯硬件那一层就可以加上奇偶校验,可以解决一部分问题
不过想可靠还是靠自己在协议上增加复杂的校验方式
根据你的实际情况考虑校验方式
一般来说就是一组数据之中加上校验位,要求越高校验位越长
https://bbs.csdn.net/topics/392167834?page=1
接受方收到数据后重新计算一下校验位,如果和发送方不一样就认为数据错误
发请求要求发送方重新发送。
串行协议为啥要校验?
*/
#include "stdio.h"
#include "string.h"
int main()
{//10个字节(起始+站号+命令+数字方向+data0+data1+data2+data3+结束码+和校验)
//从“站号”即第二位加到结束码 0X03 为 BCC 值, 不包含启始位0X7F.
int a[]={0X7F, 0X01, 0X12, 0X01, 0X01, 0X04, 0X00, 0X00, 0X03, 0X1C};
int i, xor=0, data=0;
if(a[0]==0x7F && a[8]==0X03) //校验帧头、帧尾
for(i=1; i<9; i++) //和校验
xor+=a[i];
if(xor == a[9]) //校验完成
{
data = a[4]*0x100 + a[5]; //计算距离
printf("距离=%dmm\n", data);
}
return 0;
}
串结束符null对应ASC码值0x00定义:“(字符串)” 在末尾自动添加 ,百度写的比较清楚:在ASCII码的第一个字符是NULL,它的数值是0,占用1字节;C语言把它作为字符串的最后一个字符,以表示字符串到此结束."\0"
串行不加crc校验就是不负责任,校验不过就要求重发,串行协议。
https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-15011569605.6.5f3c6518nnoDwr&id=566408829462
https://item.taobao.com/item.htm?spm=a230r.1.14.23.e37d4716JVjbsx&id=574905987374&ns=1&abbucket=3#detail
JSN-SR04T一体化超声波测距模块]倒车雷达防水型ARDUINO可定做-淘宝网 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.324f2e8d45giUW&id=40676752180&_u=bkn1qed09da
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.324f2e8d45giUW&id=40676752180&_u=bkn1qed09da
相关资料下载: pan.baidu.com/s/1dF1XNqT
- 型号:AJ-SR04M 超声波模块
AJ-SR04M 是单头,AJ-SR04K 是双头。
- 工作电压:DC 3.0 ~ 5.5V
- 距离测量范围:20cm ~ 8m
- 电位器:调节探头发散角度
软件参数调节探头发散角度
- 测量角度:75°
五种工作模式:
模式 | R19阻值 |
---|---|
兼容 SR-04 模式 | 开路(默认) |
低功耗 SR-04 模式 | 300kΩ |
自动串口模式 | 120kΩ |
触发串口模式 | 47kΩ |
PC打印模式 | 0kΩ |
时序图:
模块接收到串口触发信号,每次输出一帧,含4个8位数据,帧格式为:OXFF+H_ DATA+L_ DATA+ SUM。
各位解释如下:
- 0XFF:为一帧开始数据,用于判断;
- H_ DATA: 距离数据的高8位;
- L_ DATA: 距离数据的低8位;
- SUM: 数据和,用于效验.其0XFF为开始侦不参与校验, H_ DATA+L _DATA=SUM (仅低8位);
- H_DATA与L__DATA合成16位数据,即以毫米为单位的距离值。
例如:
产品应答:FF 07 A1 A7
- 校验码SUM=A8=(0x07+0xA1)&0x00ff;(
+
代表或运算
) - 0x07:为距离的高位数据;
- 0xA1:为距离的低位数据;
- 距离值为0x07A1,转换成十进制为1953,单位:毫米。
通过R19选中模块的启动模式,选择好模式后模块收到有效触发信号后,内部将发出 40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号或者对应串口讯号,回响信号的脉冲宽度与所测的距离成正比。
由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸,或是:距离=高电平时间*声速(340M/S) /2。
模式三、四:FF 01 56 57 (每串数字后有一个空格)
模式五:Gap=0342mm
模式五就是模式三、四转换后的结果,所以怎么处理都行。
网友评论