你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

分享一个CRC16、CRC32的计算库(Keil下调用)非源码

[复制链接]
wofei1314 发布时间:2016-11-10 11:42
Crc1632_Lib.rar (7.63 KB, 下载次数: 340)

评分

参与人数 1 ST金币 +10 收起 理由
zero99 + 10

查看全部评分

赞 收藏 2 评论15 发布时间:2016-11-10 11:42

举报

15个回答
jtc_88 回答时间:2016-11-10 16:54:04
/*modbus CRC16
5 k/ j# _( v% a2 |: Z2 [: q生成  CRC  的过程为:
% \$ q) m3 J' G7 G9 W2 y1. 将一个  16 位寄存器(称作  CRC 寄存器)初始赋值为十六进制  FFFF (全 1);
  |7 G' K, c* a1 a3 @" m2. 将报文的第一个字节( 8位)与 16 位 CRC 寄存器的低字节异或,结果置于 CRC 寄存器;
/ g5 T0 S" I3 t* y2 l3. 将  CRC 寄存器右移 1位  (向  LSB 方向), MSB 充零,并检测  LSB:
; I) q8 f; P- s# w5 o2 P( {, C4. (如果 LSB(移出来的那一位) 为  0): 重复步骤  3 (另一次移位).   (如果 LSB 为 1): 对 CRC 寄存器异或多项式值  0xA001 (1010 0000 0000 0001). ) {: {. J% j+ z' J5 W. v
5. 重复步骤  3 和 4,直到完成  8 次移位操作后,一个字节的处理完毕。 & Q0 v, V% V+ a" t7 J3 W& ]# G) o
6. 对报文中的下一个字节重复步骤 2 到 5继续此操作,直至所有报文被处理完毕。 8 d$ K, J& j/ \& p* J: p
7. CRC 寄存器中的最终值为 CRC 值. 8. 当放置 CRC 值于报文时,注意高低字节必须交换。  X- c$ z8 Z1 {  d( _8 a& n
*/
% ]$ O, y) i5 T5 O; T3 z5 [unsigned int CRC16 ( uchar *arr_buff, uchar len)
) g3 q7 R& O2 c2 K{
, P6 B; t% I* ]" V; z! m/ i( H9 C
uint crc=0xFFFF;& ?. F: B$ j2 X$ v
uchar i, j, Data;% F$ R! j) ~: d7 F' u& x& P
for ( j=0; j < len;j++ )
0 U$ B& b7 ^0 I5 D3 z0 Q: j! h7 P {9 v! Q) i; V6 |! s
- a0 |8 u" O9 Y9 X
   crc=crc ^*arr_buff++;
! ]& Y3 e) y  g3 n   for ( i=0; i<8; i++)+ @, p) p" Q8 `* o
  {
# T! f: l; C7 Z% G
! f3 v6 f1 ~; `$ R8 t" g       if( ( crc&0x0001) >0)( W& s  P, F2 `2 e" k! k
6 t. w0 b3 d9 w
       {2 _" g6 M3 W2 ]6 h$ E

" k9 R( Z+ D# J) u4 v           crc=crc>>1;
- t: W# C8 t* Y7 g- {4 f5 M! d* }% q. b1 ^/ Z
           crc=crc^ 0xa001;
! m) M& k% E+ ?
! g$ E( X: ^9 n2 d        }) X% i. e. k9 D( N
      else" w" m" X6 [7 d1 r

6 t' p! y7 F/ M& N( c0 M0 E          crc=crc>>1;, R& A( }& m" m( C
   }
9 [# M1 v7 B8 N }2 \2 a- I3 `- `
return ( crc);
; V8 Q9 E9 t( W) M) u6 ~# Z- M
: H4 D: B' o1 x% V" a}& K! J# R0 n+ a( W1 w+ Y
stary666 回答时间:2016-11-10 12:46:03
看看,,,,,,
zero99 回答时间:2016-11-10 13:22:28
感谢楼主
天外流星_0 回答时间:2016-11-10 13:41:29
这有个卵用,源码也就那么几行,你还封装成库
assssdz 回答时间:2016-11-10 17:45:05
Squall 回答时间:2016-11-11 12:15:06
额。被封装成库。。。
Squall 回答时间:2016-11-11 12:16:24
crc校验有两种方式的,一种是计算法,还有一种是恶心的查表法。
wofei1314 回答时间:2016-11-14 09:23:21
SquallBest 发表于 2016-11-11 12:16$ C7 U; v- O4 C$ K
crc校验有两种方式的,一种是计算法,还有一种是恶心的查表法。
9 G: ^: c! ]! O* A+ r: U* E
我用的就是恶心的查表法,
! v& h7 G4 m% m: S5 P$ e8 k# k) M
& V# Y* e; @  }7 z' B7 |( H- u不过,查表比较计算的要快,我倾向于查表' t9 `) t4 O- \% c/ w, N8 Q

: V7 p9 Y# g3 r: h" J3 Y0 m另外,封装起来调用就省事儿一些,感觉CRC8基本不用,所以就把CRC32和CRC16一起封装了
zengyi703-16313 回答时间:2016-11-14 17:21:58
谢谢楼上分享
yhyeefocus 回答时间:2017-1-7 15:45:12
jtc_88 发表于 2016-11-10 16:549 P* U# p& u/ J. M: F2 Q9 t5 d2 L9 g
/*modbus CRC16* r2 E4 H& f; f! r0 W
生成  CRC  的过程为: 1 J9 X# t  J# _( p
1. 将一个  16 位寄存器(称作  CRC 寄存器)初始赋值为十六进制  F ...
8 X8 c9 D# f4 ?
顶,有理论,有代码
土司Apple 回答时间:2018-5-30 14:42:17
CRC的多项式为什么是同0xA001异或而不是0x8005呢??
longfei456 回答时间:2018-6-11 17:26:40
下载下来看看,谢谢了!
STM1024 回答时间:2018-6-11 17:41:17
本帖最后由 stm1024 于 2018-6-11 17:42 编辑 ! Q4 q6 y8 x) ]
土司Apple 发表于 2018-5-30 14:422 p) ~' x' u8 K: \6 U2 A
CRC的多项式为什么是同0xA001异或而不是0x8005呢??

6 I4 _1 K! D. l+ ^8 l$ r. {你看他用的是右移,一般我们用0x8005实现的时候,用的都是左移。
) v1 p+ S1 I- q* y7 G: |6 j0 ^0x A001 =1010 0000 0000 0001B
4 n0 o+ [7 k" M3 @2 v2 T反过来写就是:1000 0000 0000 0101B=0x80052 M# Z9 c5 b; v5 j2 r) `7 J  h+ t
STM1024 回答时间:2018-6-11 17:43:14
这个……犯得着大动干戈么,一堆现成的代码可以用啊
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版