OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 37381|回复: 38

STM32 CRC校验

[复制链接]

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
发表于 2012-8-3 14:29:40 | 显示全部楼层 |阅读模式
STM32  CRC32校验很简单,只要调用库函数就可以
可是我现在有一个u8的数组,也想CRC校验,是不是就得自己写代码了啊!
努力?奋斗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

268

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
441
金钱
441
注册时间
2014-8-11
在线时间
84 小时
发表于 2015-12-27 16:10:16 | 显示全部楼层
回复 支持 1 反对 0

使用道具 举报

3

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2012-8-3
在线时间
0 小时
发表于 2012-8-3 16:09:44 | 显示全部楼层
不是很清楚!帮你把帖子顶起来
http://www.y-ec.com
http://www.cqqingye.com
回复 支持 0 反对 1

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-8-3 16:37:49 | 显示全部楼层
给你个软件校验代码:

#include "crc8_16.h"

//CRC高位字节值表
const u8 auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
};
//CRC 低位字节值表
const u8 auchCRCLo[]={
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
};
//获得CRC16值
//puchMsg:要校验的数组
//usDataLen:数组长度
u16 Get_Crc16(u8 *puchMsg,u16 usDataLen)
{
u8 uchCRCHi=0xFF;  //高CRC 字节初始化
u8 uchCRCLo=0xFF;  //低CRC 字节初始化 
u32 uIndex;  //CRC 循环中的索引
while(usDataLen--)  //传输消息缓冲区
{
uIndex=uchCRCHi^*puchMsg++; //计算CRC 
uchCRCHi=uchCRCLo^auchCRCHi[uIndex];
uchCRCLo=auchCRCLo[uIndex];
}
return (uchCRCHi<<8|uchCRCLo);
}
//CRC8校验
//ptr:要校验的数组
//len:数组长度
//返回值:CRC8码
u8 Get_Crc8(u8 *ptr,u16 len)
{
u8 crc;
u8 i;
crc=0;
while(len--)
{
crc^=*ptr++;
for(i=0;i<8;i++)
{
if(crc&0x01)crc=(crc>>1)^0x8C;
else crc >>= 1;
}
}
return crc;
}





























我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2012-8-3 16:45:47 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
喜欢这个论坛
努力?奋斗
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2012-8-6 17:05:11 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
当我使用STM32中自带的CRC32校验时,在main循环中为什么相同的数据计算的校验值不一样,只有第一次计算的正确,
而只能在循环外初始化结束时计算一次校验值
努力?奋斗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-8-6 17:28:00 | 显示全部楼层
这就不太清楚了,没用过它自带的CRC.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2012-8-24 16:36:09 | 显示全部楼层
有谁用过STM32自带的CRC32校验啊!是不是偶尔就计算错误了啊!
努力?奋斗
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2012-9-12
在线时间
3 小时
发表于 2012-11-7 14:46:03 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子大哥,你好,看了你的代码,刚好要用,能不能把你 crc8_16.h  对应的C文件发给我,
我想研究研究,490285195@qq.com  谢谢!
另外想问一下你,crc16 能不能写成 crc8那种形式的算法? 
目前处于stm32学习中,初学者水平,来论坛的目的就是找资料学习。希望遇到高手指点~~~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-11-7 18:56:02 | 显示全部楼层
见附件。

CRC8_16.rar

1.32 KB, 下载次数: 3744

回复 支持 反对

使用道具 举报

20

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
182
金钱
182
注册时间
2013-1-21
在线时间
3 小时
发表于 2013-3-10 23:08:43 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,我知道模2除法的原理,但为什么看不懂你的代码
CRC不是应该左移再和多项式相除吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-3-10 23:13:05 | 显示全部楼层
百度吧。
回复 支持 反对

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2013-3-11 12:11:04 | 显示全部楼层
回复【5楼】原味_郭:
---------------------------------
有没有做复位CRC操作?
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

52

主题

214

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2012-4-26
在线时间
17 小时
 楼主| 发表于 2013-3-14 09:32:19 | 显示全部楼层
回复【12楼】shihantu:
---------------------------------
当时就是缺了复位CRC
努力?奋斗
回复 支持 反对

使用道具 举报

2

主题

14

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-1-3
在线时间
3 小时
发表于 2014-1-23 11:30:24 | 显示全部楼层
stm32硬件算出来的CRC与标准的CRC不一样,不知道如何改,原子大哥研究过没有?
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2014-1-23 11:37:05 | 显示全部楼层
回复【14楼】santa_q:
---------------------------------
STM32的CRC32是标准的,只是非标准的成了主流而已。
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

28

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2015-3-23
在线时间
54 小时
发表于 2015-4-22 10:58:37 | 显示全部楼层
回复【15楼】styleno1:
---------------------------------
请问STM32 的CRC 究竟是怎么计算的呢?
回复 支持 反对

使用道具 举报

7

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-6-14
在线时间
1 小时
发表于 2015-6-16 22:43:59 | 显示全部楼层
留个记号,学习了
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2013-6-1
在线时间
43 小时
发表于 2015-7-21 15:43:46 | 显示全部楼层
这个怎么有点像Modbus里面的那个CRC校验
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-10-15 08:31:51 | 显示全部楼层
mark!!!!!!!!
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

10

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2015-1-17
在线时间
16 小时
发表于 2015-10-15 09:23:56 | 显示全部楼层
CRC校验原理都一样,只是选的多项式不同,因此会有各种不同的多项式算法.选择的时候一定要注意对应的多项式是不是我们的多项式.
此外校验还有方向的区别,从低位到高位和从高位到低位是不同的.(这点不算很清楚)
推荐两个能计算任意CRC的网站,可以来确定程序源码是否有误.
https://ghsi.de/CRC/
http://www.lammertbies.nl/comm/info/crc-calculation.html
回复 支持 反对

使用道具 举报

13

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2013-7-9
在线时间
6 小时
发表于 2015-12-23 12:06:12 | 显示全部楼层
回复【7楼】原味_郭:
---------------------------------
我再STM32F10X的手册CRC一节看到这样一句话  Each write operation into the data register creates a combination of the previous CRC value and the new one,甚是不解,为什么会与之前的值进行结合呢
回复 支持 反对

使用道具 举报

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
发表于 2016-2-13 11:10:33 | 显示全部楼层
楼主可以参考下面的代码,测试没有问题,和STM32F1 及F4内部CRC计算结果完全相同
#define  STM32_CRC_DEF   0x04c11db7      //STM32硬件CRC计数等式
u32 RETURN_CRC_DATA(u32 *DATA_BUF, u16 len)
{
u32    xbit = 0 ;                //CRC计算式计算 扫描变量
u32    data = 0 ;                //当前用于CRC的数据缓存
u32    CRC_DATA = 0xFFFFFFFF;    // CRC数据寄存器  返回值
u8     bits = 0 ;                    //位计数变量
while (len--)
{
  xbit = 0x80000000;
  data = *DATA_BUF++;
  for(bits = 0; bits < 32; bits++)
        {
   if(CRC_DATA & 0x80000000)   //CRC计算式计算
         {
    CRC_DATA <<= 1;
    CRC_DATA ^= STM32_CRC_DEF;
   }
   else
         {
          CRC_DATA <<= 1;
         }
                       
   if (data & xbit)   //CRC计算式计算
         {
          CRC_DATA ^= STM32_CRC_DEF;
         }
   xbit >>= 1;
  }
}
return CRC_DATA;
}

回复 支持 反对

使用道具 举报

10

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2015-12-19
在线时间
99 小时
发表于 2016-2-13 14:55:48 | 显示全部楼层
原味_郭 发表于 2012-8-24 16:36
有谁用过STM32自带的CRC32校验啊!是不是偶尔就计算错误了啊!

根本就没必要  使用内部的CRC校验   研究没什么意义   版主已经提供了软件校验代码 够用了
回复 支持 反对

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2016-3-14 20:05:44 | 显示全部楼层
那如果用STM32自带的CRC校验,但是字节数量不是4的倍数怎么办
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-2-5
在线时间
11 小时
发表于 2016-8-23 14:41:42 | 显示全部楼层
mark  
回复 支持 反对

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2016-11-24 18:06:13 | 显示全部楼层
电子玩霸 发表于 2015-12-23 12:06
回复【7楼】原味_郭:
---------------------------------
我再STM32F10X的手册CRC一节看到这样一句话&nbsp; ...

芯片设置是这样的。如果你想不跟之前的数据结合,就先做复位操作,让数据寄存器全为FF ,在输入数据求CRC。
回复 支持 反对

使用道具 举报

0

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2018-10-22
在线时间
30 小时
发表于 2018-11-22 11:22:43 | 显示全部楼层
感谢分享 学习一下
回复 支持 反对

使用道具 举报

14

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
395
金钱
395
注册时间
2018-7-16
在线时间
52 小时
发表于 2018-11-22 11:24:10 | 显示全部楼层
一般使用自己协议的CRC校验算法,网上也有很多例程的
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-3-29
在线时间
7 小时
发表于 2019-9-18 18:33:23 | 显示全部楼层
原味_郭 发表于 2012-8-24 16:36
有谁用过STM32自带的CRC32校验啊!是不是偶尔就计算错误了啊!

之前用过的,内部的计算出来  的字节顺序有时候是 倒着的
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-3-29
在线时间
7 小时
发表于 2019-9-18 18:37:26 | 显示全部楼层
void HAL_CRC_MspInit(CRC_HandleTypeDef *hcrc)
{
  __HAL_RCC_CRC_CLK_ENABLE();
}

void Modbus_CRC_Init()
{
  CrcHandle.Instance = CRC;
  CrcHandle.Init.DefaultPolynomialUse    = DEFAULT_POLYNOMIAL_DISABLE;
  CrcHandle.Init.GeneratingPolynomial    = CRC_POLYNOMIAL_16B;
  CrcHandle.Init.CRCLength               = CRC_POLYLENGTH_16B ;
  CrcHandle.Init.DefaultInitValueUse     = DEFAULT_INIT_VALUE_ENABLE;
  CrcHandle.Init.InputDataInversionMode  = CRC_INPUTDATA_INVERSION_BYTE;
  CrcHandle.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;
  CrcHandle.InputDataFormat              = CRC_INPUTDATA_FORMAT_BYTES;   //

  if (HAL_CRC_Init(&CrcHandle) != HAL_OK)
  {
    while(1);
  }
}

uint16_t Modbus_CRC16(uint8_t* MessageBuffer,uint16_t DataLength)
{
        uint16_t result;
  result = HAL_CRC_Calculate(&CrcHandle, (uint32_t *)MessageBuffer,DataLength);
  return (result<<8)|(result>>8);
}
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-3-29
在线时间
7 小时
发表于 2019-9-18 18:44:43 | 显示全部楼层
#define CRC_POLYNOMIAL_16B  (0x8005)
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-3-29
在线时间
7 小时
发表于 2019-9-18 18:45:13 | 显示全部楼层
CRC_HandleTypeDef   CrcHandle;
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2019-5-5
在线时间
3 小时
发表于 2020-8-8 12:55:12 | 显示全部楼层
原味_郭 发表于 2012-8-6 17:05
回复【3楼】正点原子:
---------------------------------
当我使用STM32中自带的CRC32校验时,在main循环 ...

每次计算前,要使用CRC_ResetDR();复位一下CRC就好了
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2020-5-11
在线时间
15 小时
发表于 2020-12-28 14:59:57 | 显示全部楼层
不错CRC校验
回复 支持 反对

使用道具 举报

13

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2017-12-15
在线时间
58 小时
发表于 2021-7-1 01:38:45 | 显示全部楼层
stm32 自带的 crc是32bit的, 而modbus 采用crc16bit,这让我很为难
回复 支持 反对

使用道具 举报

11

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
461
金钱
461
注册时间
2019-3-22
在线时间
185 小时
发表于 2022-6-9 10:21:58 | 显示全部楼层
原味_郭 发表于 2012-8-6 17:05
回复【3楼】正点原子:
---------------------------------
当我使用STM32中自带的CRC32校验时,在main循环 ...

你的问题解决了吗?我是把算CRC校验码的公式带到程序里,然后把要发送的数据作为一个变量,一直+1,也是只有第一个数据算出来的CRC校验码是对的,后面的都不对。
回复 支持 反对

使用道具 举报

70

主题

275

帖子

0

精华

高级会员

Rank: 4

积分
728
金钱
728
注册时间
2017-6-20
在线时间
188 小时
发表于 2022-7-22 11:33:46 | 显示全部楼层
正点原子 发表于 2012-8-3 16:37
给你个软件校验代码:

#include&nbsp;&quot;crc8_16.h&quot;

//CRC高位字节值表
const&nbsp;u8&nbsp;auchCRCHi[] ...

请问原子哥,我接收到01 03 02 13 88 CRC1(CRC1是B5) CRC2(CRC2是12),这个是modbus协议的,用CRC计算器算过,是B5 12。可是我用咱这个计算01 03 02 13 88这几个数后CRC1是12 ,CRC2是B5呢?正好是反着的,请问是哪里的问题啊?
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2019-7-18
在线时间
64 小时
发表于 2024-4-10 15:23:45 | 显示全部楼层
markyixia
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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