路面传感器ASCII通讯协议
1、通讯端口
(1)物理端口定义
起始位——1bit
停止位——1bit
数据位——8bits
校验位——none
波特率——9600bps
(2)端口连接
仪器与外部设备之间通过RS485 进行。
(3)数据帧格式(xxH表示16进制)
代码
含义
值
TX
起始字符
: =(3AH)
DR
设备通讯地址
默认(01H)
MD
命令码
(00H-FFH)
ataNum
字节数
(00H-FFH)
ATA(0)
数据项0
…
……
……
ATA(n-1)
数据项n-1
RC CHK
LRC校验
ND 1
结束字符1
<CR>(0DH)
ND 0
结束字符0
<LF>(0AH)
- STX(起始字符)
: = 3AH
- ADR(通讯地址)
有效通讯地址范围00H-20H,默认设备地址01H
- CMD(命令码)
47H 查询当前路面参数 路面的各种参数
- DataNum(数据字节数)
从DATA(0)到DATA(n-1)的字节数,共n项
- LRC(校验)
LRC =( ~((ADR + CMD + DataNum + DATA(0)+ …… + DATA(n-1))&0xFF ))+ 1
- END(结束字符)
END1= <CR>(0DH),END0= <LF>(0AH)
起始和结束字符外,整个数据帧传输以ASCII编码方式传输
TX
起始字符
:=(3AH)
DR.HB
设备通讯地址高半字节
默认=30H
DR.LB
设备通讯地址低半字节
默认=31H
MD.HB
命令码高半字节
MD.LB
命令码低半字节
ataNum.HB
字节数高半字节
ataNum.LB
字节数低半字节
ATA(0).HB
数据项0高半字节
设备响应
ATA(0).LB
数据项0低半字节
…
……
……
ATA(n-1).HB
数据项(n-1)高半字节
ATA(n-1).LB
数据项(n-1)低半字节
RC CHK.HB
校验和高半字节
RC CHK.LB
校验和低半字节
ND1
结束字符1
<CR> =(0DH)
ND0
结束字符0
<LF> =(0AH)
中间各字节分别取其高半字节和低半字节,转为ASCII码。 设备地址为21H,则ADR.HB =32H, ADR.LB =31H,其余字节雷同
通讯响应
指令编码
含义
1H
设备错误响应
2H
设备正确响应
错误响应编码
错误响应
含义
1H
通讯地址错误
2H
命令码不存在
3H
内存数据不存在
7H
错误校验和
…
……
2、通讯协议(以地址01H说明)
(1)查询当前路面状态1(47H)
PC -> 传感器
地址码ADR
01H
命令码CMD
47H
字节数Bytes
00H
LRC
B8H
- 数据帧结构
:014700B8<CR><LF>
正确响应
地址码ADR
01H
命令码CMD
47H
字节数DataNum
18H
响应
A2H
数据项DATA0.DH
路面温度. 高字节
数据项DATA0.DM1
路面温度.中间字节1
数据项DATA0.DM2
路面温度.中间字节2
数据项DATA0.DL
路面温度. 低字节
数据项DATA1.DH
水膜的厚度.高字节
数据项DATA1.DM1
水膜的厚度
数据项DATA1.DM2
水膜的厚度
数据项DATA1.DL
水膜的厚度.低字节
数据项DATA2.DH
冰的厚度.高字节
数据项DATA2.DM1
冰的厚度
数据项DATA2.DM2
冰的厚度
数据项DATA2.DL
冰的厚度.低字节
数据项DATA3.DH
雪的厚度.高字节
数据项DATA3.DM1
雪的厚度
数据项DATA3.DM2
雪的厚度
数据项DATA3.DL
雪的厚度.低字节
数据项DATA4.DH
湿滑系数.高字节
数据项DATA4.DM1
湿滑系数
数据项DATA4.DM2
湿滑系数
数据项DATA4.DL
湿滑系数.低字节
数据项DATA5.DH
路面状态.高字节(表1)
数据项DATA5.DL
路面状态.低字节(表1)
数据项DATA6
硬件状态(表2、表3)
LRC
XXH
备注
数据项DATA0、DATA1、数据项DATA2、数据项DATA3、数据项DATA4 为4个字节浮点型数据。
数据项DATA5 为整形数据(2个字节)
数据项DATA6 为字符型(1个字节)
备注:
1 路面状况 整数(数据项DATA5)
表1 路面状态码
W(警告) 高字节
S(路面状态) 低字节
0 NO WARNING (无警告)
0 ERROR(出错)
1 WARNING (警告)
1 DRY(干)
2 ALARM (报警)
2 MOIST(潮)
3 FROST WARNING (霜警告)
3 WET(湿)
4 OBSTRUCT(阻挡警告)
4 预留
5 FROST(霜)
6 SNOW(雪)
7 ICE(冰)
8 预留
9 SLUSHY(冰水混合)
2 硬件状态(数据项DATA6 高字节)
表2 硬件状态码(十六进制)
镜头及模块状态 高四位
硬件状态 低四位
0 接收器窗清洁
0 硬件OK
1 警告-接收器窗污染
1 CPU硬件警告
2 报警-接收器窗污染严重
2 激光器警告
4 测距模块异常
x
- 返回数据(ASCII):
:014718A2417800004006666600000000000000003F35C28F0003402B<CR><LF>
备注
: 起始字符STR01 地址码ADR47 命令码CMD18 数据字节数DataNumA2 响应41 78 00 00 路面温度(15.5°C)40 06 66 66 水膜的厚度(2.1mm)00 00 00 00 冰的厚度(0mm)00 00 00 00 雪的厚度(0mm)3F 35 C2 8F 湿滑系数(0.71)00 03 路面状态(水 无警告)40 硬件状态(测距模块异常)2B LRC校验码<CR> 结束符1(0x0d)<LF> 结束符2(0x0a)
(2)查询当前路面状态2(48H)
PC -> 传感器
地址码ADR
01H
命令码CMD
48H
字节数Bytes
00H
LRC
B7H
- 数据帧结构
:014800B7<CR><LF>
返回数据格式
HONGYUV HY-RSS11 SYSTEM <LF> VERSION V1.30<LF> <LF> ROAD TEMP : -20.00<LF> ROAD STATE : DRY<LF> GRIP : 0.82<LF> WATER : 0.00<LF> ICE : 0.00<LF> SNOW : 0.00<LF> CLEAN : 71.9 RELATIVE 1.01<LF> RECEIVER WINDOWS : ALARM<LF> HARDWARE : EMITTER WARNING<LF> INPUT VOLTAGE : 23.4<LF>备注
ROAD TEMP : -20.00 路面温度ROAD STATE : DRY 显示路面状态,如有警告或报警,后续紧跟着显示GRIP :0.82 湿滑系数(0~1)WATER : 0.00 水膜厚度ICE : 0.00 冰的厚度SNOW : 0.00 雪的厚度CLEAN : 71.9 当前接收器窗清洁值RELATIVE 1.01 当前清洁系数RECEIVER WINDOWS : ALARM 接收器窗状态HARDWARE : EMITTER WARNING 硬件状态INPUT VOLTAGE : 23.4 输入电压
(3)查询当前干标定值(49H)
PC -> 传感器
地址码ADR
01H
命令码CMD
49H
字节数Bytes
00H
- 数据帧结构
:014900B6<CR><LF>
返回数据格式
dry: 24940 1570 900<CR><LF> wet: 0 0 0<CR><LF>
(4)查询清洁参考值(4BH)
PC -> 传感器
地址码ADR
01H
命令码CMD
4BH
字节数Bytes
00H
LRC
B4H
- 数据帧结构
:014B00B4<CR><LF>
- 返回数据格式
CLEAN RX: 11.1<CR><LF>
(5)设置清洁参考值(4CH)
PC -> 传感器
地址码ADR
01H
命令码CMD
4CH
字节数Bytes
00H
LRC
B3H
- 数据帧结构
:014C00B3<CR><LF>
- 返回数据格式
UPDATED: 1308->1258<CR><LF>
(6)查询仪器通讯(00H)
PC -> 传感器
地址码ADR
01H
命令码CMD
00H
字节数Bytes
00H
LRC
FFH
- 数据帧结构
:010000FF<CR><LF>
- 返回数据格式
:010000FF<CR><LF>
(7)查询或设置仪器地址(AAH)
PC -> 传感器
地址码ADR
00H
命令码CMD
AAH
字节数Bytes
00H
LRC
56H
- 数据帧结构
:00AA0056<CR><LF>
- 返回数据格式
:01AA010153<CR><LF>
备注
: 起始字符STR01 地址码ADRAA 命令码CMD01 数据字节数DataNum01 仪器地址56 校验码
(8) 设置仪器地址 (AAH)
PC -> 传感器
地址码ADR
01H
命令码CMD
AAH
字节数Bytes
01H
数据项
02H
LRC
52H
- 数据帧结构
:01AA010252<CR><LF>
- 返回数据格式
:02AA010251<CR><LF>
备注
: 起始字符STR02 新地址码ADRAA 命令码CMD01 数据字节数DataNum02 仪器新地址51 校验码如果当前仪器地址码未知,需要设置仪器地址,地址码ADR可以用广播地址(00H),但是通讯总线上连接的仪器只能有一台。新地址必须大于等于01H ,默认为01H 。例如::00AA010253<CR><LF>
3、附录 LRC校验
(1)用一个C语言功能码产生LRC值。
该功能码用2个自变量:
unsigned char *auchMsg; //为生成LRC值,把指针指向含有二进制数据的缓冲器 unsigned short usDataLen; //缓冲器中的字节数。 //该功能返回LRC作为一种类型“unsigned char” 。 //LRC校验码的产生 static unsigned char LRCCheck(auchMsg, usDataLen) unsigned char *auchMsg; /*按信息的字节计算LRC*/ unsigned short usDataLen; /*按信息的字节计算LRC*/ { unsigned char uchLRC = 0 ; /*初始化LRC字符 */ while (usDataLen--) /*通过数据缓冲器*/ uchLRC += *auchMsg++; /*加缓冲器字节无进位*/ return ((unsigned char)(–((char)uchLRC))) ; /*返回二进制补码*/ }
(2)4个字节转换为浮点数。
Union //公用体 { float TestData_Float; //浮点数(4个字节) unsigned long TestData_Long; //长整形(4个字节) uint8 TestData_Array[4]; //4个字节长的数组 struct // { unsigned int DL; //整形(2个字节) unsigned int DH; //整形(2个字节) }TestData_Int; // struct { unsigned char D0; //字符型(1个字节) unsigned char D1; // unsigned char D2; // unsigned char D3; // }TestData_char; }TData; 例如: float Tempfloat; TData.TestData_char.D3=0x3f; //输入高字节 TData.TestData_char.D2=0x3a; // TData.TestData_char.D1=0xe1; // TData.TestData_char.D0=0x48; //低字节 Tempfloat=TData.TestData_Float; //得到浮点数0.73