chenjunt 发表于 2020-12-1 22:59

MODBUS协议 485通讯问题

SH79F3283 用了计算法和查表法来进行CRC校验,但是两种方法都没有的到我想要的结果

lium 发表于 2020-12-1 23:03


楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

chenjunt 发表于 2020-12-1 23:10

uint16_t getcrc16(uint8_t *puchMsg, uint8_t usDataLen)   
{
      unsigned short tmp = 0xffff;
      unsigned short ret1 = 0;
      int n, i;
      for(n = 0; n < usDataLen; n++)
      {
                tmp = puchMsg ^ tmp;
                for(i = 0; i < 8; i++)
                {
                        if(tmp & 0x01)
                        {
                              tmp = tmp >> 1;
                              tmp = tmp ^ 0xa001;
                        }
                        else
                              tmp = tmp >> 1;
                }
      }
      ret1 = tmp >> 8;
      return (ret1 | (tmp << 8));
      
//    uint8_t uchCRCHi = 0xFF ;
//    uint8_t uchCRCLo = 0xFF ;
//    uint8_t uIndex = 0;
//    uint16_t crc_data;   
//      
//    while (usDataLen--)
//    {   
//      uIndex = uchCRCHi ^ *puchMsg++;
//      uchCRCHi = uchCRCLo ^ auchCRCHi;   
//      uchCRCLo = auchCRCLo ;
//    }   
//      crc_data = uchCRCHi;
//      crc_data =crc_data << 8;
//    return (uint16_t)(crc_data | uchCRCLo) ;
}      
我输入的数据是uint8_t    rx_buff = {0x01,0x03,0x00,0x01,0x00,0xd5,0xca};
返回的数据应该的是01 03 02 03 E9 79 3A 才对,但是两个方法的返回值的第一位分别为04和02,其他的都能对应上,数组也没有超限

llia 发表于 2020-12-1 23:13


01 03 00 01 00 D5 CA
输入7字节。
Modbus CRC16校验(查表)计算结果:D4C8

chenjunt 发表于 2020-12-1 23:17

我只是对前5位校验,可是为什么校验完了之后第一位数据会被改变?

zhuhuis 发表于 2020-12-1 23:20

溢出造成的?

chenjunt 发表于 2020-12-1 23:27

我将数组扩大了好几倍,应该不会是溢出造成的

happy_10 发表于 2020-12-1 23:31

不知道是哪里错了

chenjunt 发表于 2020-12-1 23:35


唉,还是没有什么结果,算了,多谢大家啦
页: [1]
查看完整版本: MODBUS协议 485通讯问题