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

分享一个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
; Y+ f" c. Z& f4 e$ X1 D$ o生成  CRC  的过程为:
' O/ X+ G4 a1 Y5 I9 J; H1 h* o1. 将一个  16 位寄存器(称作  CRC 寄存器)初始赋值为十六进制  FFFF (全 1);' w& X# A) r" n3 q; b8 ?' F' m! A
2. 将报文的第一个字节( 8位)与 16 位 CRC 寄存器的低字节异或,结果置于 CRC 寄存器;( h& Z$ T, e& H5 ?" ]" U7 }0 E
3. 将  CRC 寄存器右移 1位  (向  LSB 方向), MSB 充零,并检测  LSB:. e( [0 b# ]" w* z9 F
4. (如果 LSB(移出来的那一位) 为  0): 重复步骤  3 (另一次移位).   (如果 LSB 为 1): 对 CRC 寄存器异或多项式值  0xA001 (1010 0000 0000 0001). 0 J% F6 u2 L  Z! d1 j& b4 E1 ^
5. 重复步骤  3 和 4,直到完成  8 次移位操作后,一个字节的处理完毕。
$ B* h# G# \! A$ D) }2 z; ~6. 对报文中的下一个字节重复步骤 2 到 5继续此操作,直至所有报文被处理完毕。
4 c; K2 c1 ]/ b9 p6 n7. CRC 寄存器中的最终值为 CRC 值. 8. 当放置 CRC 值于报文时,注意高低字节必须交换。0 M  O4 k6 j- k+ z/ g9 k
*/! e5 U8 E- r* d( w4 M* R1 h5 A/ w
unsigned int CRC16 ( uchar *arr_buff, uchar len)
# d5 `( s# d3 q% o# n: g9 D{
7 x1 G4 Y3 c& }6 Y
, o0 V: g" m5 `6 r0 r* ?9 D, B uint crc=0xFFFF;' @, d& ?' S' A+ g+ e* I
uchar i, j, Data;
8 ~/ ?8 D- A5 ^- @' e" P" ~' q for ( j=0; j < len;j++ )
- V% D* I- N2 R5 h/ ~ {
2 i. c: r3 f# }) t2 t+ w6 v# h+ j# J- r, u& ^0 O7 B: A5 c
   crc=crc ^*arr_buff++;  t* t- A" {$ v! z. B
   for ( i=0; i<8; i++)" e3 h8 j$ b9 q- R& E* w
  {
8 o- M2 a9 e& q' ~) R% {4 }: i/ s6 Y/ ^, M1 j. i; p
       if( ( crc&0x0001) >0)- P% i4 C! U# G" z4 S
- Q, A  K* a) Q9 |+ w
       {
9 i) K7 w$ z. l9 b' R9 s& |, Y, [' d
7 I- r) @3 X% ?5 D/ m6 d           crc=crc>>1;
, v; m2 @$ N$ F3 S7 J- H/ w3 i& @$ b2 y5 s+ m* t
           crc=crc^ 0xa001;! P: d3 J# J/ Z# {, H

% k% v2 [" U. o) E8 @4 J; G        }
3 w" ~0 s9 x; A5 _' D. _, E      else& I+ `2 l* L( \9 x

" q( m6 ?3 B' |) c          crc=crc>>1;( Q6 k  X5 o' _5 Y
   }. l+ {; f, u$ t/ ^2 n
}) M  Y( Q2 W; a8 g5 Q
return ( crc);
1 G+ V0 B" F3 T$ h5 h% W, B$ U" P; A! c  e! E# a1 b- H
}: A' d; m0 N* q, S* ]
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
* l4 g! `% c2 j- y1 J6 ?8 D3 tcrc校验有两种方式的,一种是计算法,还有一种是恶心的查表法。
8 n& h3 \7 p" A  }0 ?, Z# b/ Y4 y
我用的就是恶心的查表法,
  j. t: \0 v3 ~. W+ X! t3 E* P8 E% @* G8 N& w6 e
不过,查表比较计算的要快,我倾向于查表$ D4 k! S# n9 E6 K
& i4 U1 X: W2 v5 q
另外,封装起来调用就省事儿一些,感觉CRC8基本不用,所以就把CRC32和CRC16一起封装了
zengyi703-16313 回答时间:2016-11-14 17:21:58
谢谢楼上分享
yhyeefocus 回答时间:2017-1-7 15:45:12
jtc_88 发表于 2016-11-10 16:54
2 q0 L8 }) ?# Y  K/*modbus CRC16
0 U6 q, C& n8 a( W- l/ U生成  CRC  的过程为:
, i5 q8 c$ d: J6 b% s1. 将一个  16 位寄存器(称作  CRC 寄存器)初始赋值为十六进制  F ...

1 w- o. W( @& F/ l+ i$ s' m1 |顶,有理论,有代码
土司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 编辑
2 h3 Y: i4 ?( x  `
土司Apple 发表于 2018-5-30 14:42
! ]6 N" }6 R; Y5 L3 p1 ?+ S8 \1 fCRC的多项式为什么是同0xA001异或而不是0x8005呢??
5 t0 g5 O* u7 M+ p& Z! @
你看他用的是右移,一般我们用0x8005实现的时候,用的都是左移。
3 n$ a7 ]3 D. O; }0x A001 =1010 0000 0000 0001B! f; [2 ?/ K, ]+ N4 I& w$ x
反过来写就是:1000 0000 0000 0101B=0x8005* G4 }) q' n8 [! [8 n6 e% J/ G
STM1024 回答时间:2018-6-11 17:43:14
这个……犯得着大动干戈么,一堆现成的代码可以用啊
12下一页

所属标签

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