- 打卡等级:以坛为家I
- 打卡总天数:334
- 最近打卡:2026-04-28 11:53:20
超级版主
- 积分
- 15865
|
发表于 2026-4-20 12:19:45
|
显示全部楼层
MODBUS异常帧格式:[从站地址] [功能码+0x80] [异常码] [CRC]。
最初编写程序时漏写了功能码+0x80这个字节了,改为如下的程序:
while (1)
{
if(B_RX1_OK && !B_TX1_Busy) //收到数据, 进行MODBUS-RTU协议解析
{
if(MODBUS_CRC16(RX1_Buffer, RX1_cnt) == 0) //首先判断CRC16是否正确, 不正确则忽略, 不处理也不返回信息
{
if((RX1_Buffer[0] == 0x00) || (RX1_Buffer[0] == SL_ADDR)) //然后判断站号地址是否正确, 或者是否广播地址(不返回信息)
{
if(RX1_cnt > 2) RX1_cnt -= 2; //去掉CRC16校验字节
i = MODBUS_RTU(); //MODBUS-RTU协议解析
if((i != 0) && (RX1_Buffer[0] != 0)) //非广播地址错误处理
{
TX1_Buffer[0] = SL_ADDR; //站号地址 MODBUS异常帧格式:[从站地址] [功能码+0x80] [异常码] [CRC]
TX1_Buffer[1] = RX1_Buffer[1] +0x80; //功能码+0x80
TX1_Buffer[2] = i; //错误代码
crc = MODBUS_CRC16(TX1_Buffer, 3);
TX1_Buffer[3] = (u8)crc; //CRC是小端模式, 先发低字节,后发高字节。
TX1_Buffer[4] = (u8)(crc>>8);
B_TX1_Busy = 1; //标志发送忙
TX1_cnt = 0; //发送字节计数
TX1_number = 5; //要发送的字节数
TI = 1; //启动发送
}
}
}
RX1_cnt = 0;
B_RX1_OK = 0;
}
}
|
|