迪文科技论坛

 找回密码
 立即注册
搜索
查看: 424|回复: 5

【提问】“C_8283协议”程序中的CRC校验函数无法正确工作

[复制链接]

9

主题

18

回帖

264

积分

中级会员

Rank: 3Rank: 3

积分
264
发表于 2023-6-30 15:16:14 | 显示全部楼层 |阅读模式
为了用C51编写Modbus功能,抄了“C_8283协议(全功能、全串口)1.2”中的CRC校验部分,用keil  C编译后,烧写到屏幕,计算出的校验结果是错误的。
相同的代码,在STM32 MCU、电脑上可以得到正确的校验结果。
T5L2有什么特别要注意的地方吗?


回复

使用道具 举报

2

主题

1228

回帖

9372

积分

论坛元老

Rank: 8Rank: 8

积分
9372
发表于 2023-6-30 17:18:17 | 显示全部楼层
u8 xdata TP_Data_Return[100]={0x5A,0xA5,0x06,0x83,0x25,0x00,0x01,0x00,0x00};


/*CRC校验*/
u16 crc16(u8 *dat, u16 length)  
{  
    u8 i;  
    u16 crc = 0xffff;        // Initial value  
    while(length--)  
    {  
        crc ^= *dat++;            // crc ^= *dat; dat++;  
        for (i = 0; i < 8; ++i)  
        {  
            if (crc & 1)  
                crc = (crc >> 1) ^ 0xA001;        // 0xA001 = reverse 0x8005  
            else  
                crc = (crc >> 1);  
        }
    }
    return crc;  
}

crc16(&TP_Data_Return[3],TP_Data_Return[2]-2 );
TP_Data_Return[TP_Data_Return[2]+2] = (u8)(CRC_dat>>8) ;
TP_Data_Return[TP_Data_Return[2]+1] = (u8)(CRC_dat) ;

不查表实时计算的试一下,以这个为例
回复

使用道具 举报

9

主题

86

回帖

726

积分

高级会员

Rank: 4

积分
726
发表于 2023-7-1 00:06:54 | 显示全部楼层
迪文的上位机好像也不支持带CRC的下载啊。
回复

使用道具 举报

0

主题

468

回帖

8643

积分

论坛元老

Rank: 8Rank: 8

积分
8643
发表于 2023-7-1 08:55:28 | 显示全部楼层
串口下载得关闭CRC的
回复

使用道具 举报

9

主题

18

回帖

264

积分

中级会员

Rank: 3Rank: 3

积分
264
 楼主| 发表于 2023-7-3 11:14:32 | 显示全部楼层
折腾几天找到了解决办法,const u8 crctablehi[]和const u8 crctablelo[]的const换成code就OK了。
虽然找到了解决办法,但不知道必须这么改的原因。
回复

使用道具 举报

0

主题

4

回帖

93

积分

注册会员

Rank: 2

积分
93
发表于 2024-8-9 16:57:49 | 显示全部楼层
刚好也碰到这个问题,CRC_16/modbus计算,感谢@varsoo
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-25 06:04 , Processed in 0.179421 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表