-1

您好,我正在尝试通过 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);
    }
  }
 }
4

1 回答 1

0

对于每个字节的数据:

crc ^= data[i];
crc = crc & 1 ? (crc >> 1) ^ 0xa001;
crc = crc & 1 ? (crc >> 1) ^ 0xa001;
crc = crc & 1 ? (crc >> 1) ^ 0xa001;
crc = crc & 1 ? (crc >> 1) ^ 0xa001;
crc = crc & 1 ? (crc >> 1) ^ 0xa001;
crc = crc & 1 ? (crc >> 1) ^ 0xa001;
crc = crc & 1 ? (crc >> 1) ^ 0xa001;
crc = crc & 1 ? (crc >> 1) ^ 0xa001;

就这些。

于 2021-12-12T20:40:36.697 回答