路面传感器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>

备注

: 起始字符STR
01 地址码ADR
47 命令码CMD
18 数据字节数DataNum
A2 响应
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>

备注

: 起始字符STR
01 地址码ADR
AA 命令码CMD
01 数据字节数DataNum
01 仪器地址
56 校验码

(8) 设置仪器地址 (AAH)

PC -> 传感器

地址码ADR

01H

命令码CMD

AAH

字节数Bytes

01H

数据项

02H

LRC

52H

数据帧结构

:01AA010252<CR><LF>

返回数据格式

:02AA010251<CR><LF>

备注

: 起始字符STR
02 新地址码ADR
AA 命令码CMD
01 数据字节数DataNum
02 仪器新地址
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