在计算功能代码1的Modbus CRC校验时需要帮助,即读取线圈寄存器。我有用于功能码3的CRC校验的示例代码,即用于模拟输入的寄存器。
# Read Coil Status (FC=01)
## Request
此命令请求离散线圈#20至56的ON / OFF状态 从地址为17的从设备。
11 01 0013 0025 0E84
11 01 05 CD6BB20E1B 45E6
此命令正在请求模拟输出保持寄存器#40108的内容 从设备地址为40的40110。
11 03 006B 0003 7687
11 03 06 AE41 5652 4340 49AD
对于获得FC3的响应我没有问题。因为我正确发送了2个字节的地址,但是我不知道如何发送单字节并修改FC1的crc功能->读取线圈寄存器
Discription of read coil register
unsigned int crc_fn(unsigned char *dpacket,unsigned int len) { // CRC Function(Error calcualtion)
unsigned int crc = 0xffff,poly = 0xa001;
unsigned int i=0;
for(i=0; i<len; i++) {
crc^= dpacket[i];
for(j=0; j<8; j++) {
if(crc & 0x01) {
crc >>= 1;
crc ^= poly;
} else
crc >>= 1;
}
}
return (crc);
}
答案 0 :(得分:0)
通常,CRC首先附加到最高有效字节的消息上。您需要交换两行代码,在低位字节之前发送16位crc的高位字节。尝试此更改:
Serial_1_Send_byte((unsigned char)(crc1>>8));
Serial_1_Send_byte((unsigned char)crc1);