金牌会员
 
- 积分
- 2107
- 金钱
- 2107
- 注册时间
- 2017-2-11
- 在线时间
- 307 小时
|
发表于 2020-5-21 21:22:48
|
显示全部楼层
很简单啊。你只是对modbus协议不是很清楚。按你的意思,你应该使用读功能码(0x03):帧格式如下:
主节点发送帧格式:
序号 0 1 2 3 4 5 6 7
字段定义 ADDR CMD MSB LSB MSB LSB LSB MSB
解释 控制器地址 命令类型 寄存器起始地址 寄存器个数 CRC校验
从节点正常应答帧格式:
序号 0 1 2 3 4 5 6 ... L+1 L+2 L+3 L+4
字段定义 ADDR CMD Length MSB LSB MSB LSB MSB LSB LSB MSB
解释 控制器地址 命令类型 发送字节数L=n*2 第一个寄存器值 第二个寄存器值 ... 最后一个寄存器值 CRC校验
CRC校验算法:
u16 count_CRC(u8 *addr,u32 num)
{
u16 crc = 0XFFFF;
u32 i;
while(num --)
{
crc ^= *addr++;
for(i = 0;i < 8;i++)
{
crc = (crc & 0x0001) ? ((crc>>1)^0xA001) crc>>1);
}
}
return crc;
}
读03功能码需要你自己去写哦,还有异常码的回复需要自己去写。另外,可以通过DMA+空闲,这样就更快了 |
|