[其它应用] MODBUS协议 485通讯问题

[复制链接]
 楼主| chenjunt 发表于 2020-12-1 22:59 | 显示全部楼层 |阅读模式
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[n] ^ 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[uIndex];   
//        uchCRCLo = auchCRCLo[uIndex] ;
//    }   
//        crc_data = uchCRCHi;
//        crc_data =  crc_data << 8;
//    return (uint16_t)(crc_data | uchCRCLo) ;
}        
我输入的数据是uint8_t    rx_buff[8] = {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 | 显示全部楼层

唉,还是没有什么结果,算了,多谢大家啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

718

主题

7868

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部