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

[复制链接]
190|2
 楼主 | 2019-7-2 11:58 | 显示全部楼层 |阅读模式
大佬们,我用了计算法和查表法来进行CRC校验,但是两种方法都没有的到我想要的结果,能帮我研究研究吗?
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,其他的都能对应上,数组也没有超限,求大神帮忙指点一二。

使用特权

评论回复
| 2019-7-2 19:32 | 显示全部楼层
01 03 00 01 00 D5 CA
输入7字节。
Modbus CRC16校验(查表)计算结果:D4C8

使用特权

评论回复
 楼主 | 2019-7-8 11:16 | 显示全部楼层
Diyer123 发表于 2019-7-2 19:32
01 03 00 01 00 D5 CA
输入7字节。
Modbus CRC16校验(查表)计算结果:D4C8

我只是对前5位校验,可是为什么校验完了之后第一位数据会被改变?我将数组扩大了好几倍,应该不会是溢出造成的,是在是不知道是哪里错了

使用特权

评论回复
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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