您好,我正在尝试通过 modbus rtu 与 arduino 通信 omron hmi。我实际上只是在用 arduino 收听数据,所以我可以分析数据传输。但是当我尝试创建它的 crc 时,我无法获得正确的 crc 数据。下面是算法和我写的代码。如果有人知道问题,请帮助我。
Blockquote CRC-16 计算示例 一条消息在称为 CRC 寄存器的 16 位处理寄存器中一次处理 1 个字节。
1 在 CRC 寄存器中设置 FFFF hex 的默认值。
2 对 CRC 寄存器的内容和报文的第一个字节进行异或运算,结果返回到 CRC 寄存器。
3 CRC 寄存器的内容右移 1 位,并将 0 放在 MSB 中。
4 如果从 LSB 移出的位为 0,则重复步骤 3(即,寄存器的内容再移 1 位)。如果从 LSB 移出的位为 1,则将 CRC 寄存器的内容与 A001 hex 的内容进行异或,并将结果返回到 CRC 寄存器。
5 重复第 3 步和第 4 步,直到寄存器的内容右移 8 位。
6 如果尚未到达报文末尾,则将报文的下一个字节与 CRC 寄存器进行异或,结果返回到 CRC 寄存器,并从步骤 3 开始重复该过程。
7 结果(CRC 寄存器中的值)放在消息的低字节中。附加结果示例 如果计算出的 CRC 值为 1234 hex,则按如下方式将其附加到命令帧中。
crc=0xFFFF; //A default value of FFFF hex is set in the CRC register.
LSB=0;
cnt=0;
Serial.print("CRC-");
Serial.println(crc,BIN);
for(i=0;i<13;i++)
{
//An XOR is taken of the contents of the CRC register and the first byte of the message, and the
//result is returned to the CRC register.
//If the end of the message has not been reached, an XOR is taken of the next byte of the
//message and the CRC register, the result is returned to the CRC register, and the procedure is
//repeated from step 3.
crc=crc^data[i];
LSB=crc&1;
cnt=0;
while(cnt<8) //Steps 3 and 4 are repeated until the contents of the register have been shifted 8 bits to the right.
{
crc=crc>>1; //The contents of the CRC register is shifted 1 bit to the right, and 0 is placed in the MSB.
crc=crc&0x7fff;
cnt++;
//LSBe=LSB;
LSB=crc&1;
if(cnt==8)break;
Serial.print("LSB-");
Serial.println(LSB,HEX);
// If the bit shifted from the LSB is 0, step 3 is repeated (i.e., the contents of the register is shifted 1 more bit).
//If the bit shifted from the LSB is 1, an XOR is taken of the contents of the CRC register and
//A001 hex, and the result is returned to the CRC register.
if(LSB==0)
{
crc=crc>>1;
crc=crc&0x7fff;
cnt++;
Serial.print("CRC2-");
Serial.println(crc,BIN);
}
else if(LSB==1)
{
crc=crc^operation;
Serial.print("CRC3-");
Serial.println(crc,BIN);
}
}
}