这次来记录下modbus协议的理解和分析
先说串口的通讯解析。一般是2种方式
第一种是基于通讯帧的包头作为帧起始,一般格式固定
例如 包头+数据长度+命令+数据+校验 或者 包头+数据长度+命令+数据+校验+包尾。
包头一般是特定的数据。对于这种通讯帧类型,可以按照字节接收进行包头判断,等数据长度到达后进行校验来断帧,也可以直接按帧接收。
第2种则是按照通讯帧的时间间隔来分隔,例如modbus rtu 。通讯帧按照3.5个字符的时间来分隔。对于这种情况,如果有空闲中断,可以用空闲中断来接收。也可以用定时器去处理帧,或者也可以用自己计时,波特率已经知道,3.5个字符的超时时间也可以知道。可以参考安富莱的处理。
再来说下modbus rtu
modbus的组成
地址+功能码+数据+CRC16
(1) 功能码03:读多路寄存器(读取状态时用到)
(2) 功能码06:写单路寄存器(写数据到对应的单个寄存器)
(3) 功能码10:写多路寄存器(写数据到对应的多个寄存器,完成设置参数)
功能码06
设备地址 功能码 寄存器地址 寄存器内容 CRC校验码
回复
设备地址 功能码 寄存器地址 寄存器内容 CRC校验码
功能码03
设备地址 功能码 寄存器地址 寄存器长度 CRC校验码
回复
设备地址 功能码 字节长度 数据 CRC校验码
功能码10
设备地址 功能码 寄存器起始地址 寄存器长度 字节数 寄存器内容 CRC校验码
回复
设备地址 功能码 寄存器起始地址 寄存器长度 CRC校验码
寄存器地址一般是自己定义。
一般modbus协议都是由主机发起,从机返回数据。