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

分享一个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
! b! W  V8 Z/ `# h0 o1 a% q生成  CRC  的过程为:
' G% D7 J; _- |4 X. U, A$ d, T1. 将一个  16 位寄存器(称作  CRC 寄存器)初始赋值为十六进制  FFFF (全 1);
3 W3 @" B+ |# y2. 将报文的第一个字节( 8位)与 16 位 CRC 寄存器的低字节异或,结果置于 CRC 寄存器;
- y; w) ~5 Y2 G( |3. 将  CRC 寄存器右移 1位  (向  LSB 方向), MSB 充零,并检测  LSB:9 p! L3 c' C: r
4. (如果 LSB(移出来的那一位) 为  0): 重复步骤  3 (另一次移位).   (如果 LSB 为 1): 对 CRC 寄存器异或多项式值  0xA001 (1010 0000 0000 0001).
4 N2 u7 E! H3 Q9 b) }( X5. 重复步骤  3 和 4,直到完成  8 次移位操作后,一个字节的处理完毕。
/ A+ Q! U  c9 `! D$ @9 W8 @' E  J6. 对报文中的下一个字节重复步骤 2 到 5继续此操作,直至所有报文被处理完毕。
3 f# H  Q6 x! i8 f' n. n7. CRC 寄存器中的最终值为 CRC 值. 8. 当放置 CRC 值于报文时,注意高低字节必须交换。
/ l2 e6 F) o/ x4 }3 z  g8 w' B*/
" @2 L9 ]) m: G3 _$ v2 B* ?unsigned int CRC16 ( uchar *arr_buff, uchar len)( f: R9 ]7 ^; G
{: e- r4 F: o+ u$ R
9 B. c3 R9 Z  r
uint crc=0xFFFF;
3 |) e2 ]& q3 o& H uchar i, j, Data;7 P6 d4 u7 r3 p2 U/ i4 h
for ( j=0; j < len;j++ )" P9 U4 Y5 J& y# {
{6 v. i) d( x0 W. V
/ x4 ?7 ~6 ~' T
   crc=crc ^*arr_buff++;
" C3 A3 S5 g7 ^1 l   for ( i=0; i<8; i++)
, [5 P: w: z4 Q+ S9 \  {
% N$ n5 \) |- o& X& `4 W# Z# a5 H8 k+ M4 M9 y. ]
       if( ( crc&0x0001) >0)! ]  Z9 J% {4 z( A% e% v; h6 _5 ], f
. e% U7 q& E- G; A
       {  `2 w) {% {# \1 d0 b1 R
8 T( [6 t/ n  [% z( f$ S7 L0 B& ?
           crc=crc>>1;
* Z) i; E' q6 p- E* A( O' @8 L& A/ \& H( f/ @2 m3 m& E
           crc=crc^ 0xa001;) D( t% v! v( M5 \7 X

3 ?1 x! u" A; M* h% R  L        }
$ [8 c- s! F" r- g8 J      else+ z8 X; a3 [  A& t

$ ]1 H' A7 X- L' l! N          crc=crc>>1;  e7 Y" @, T* ^: a8 b
   }: S# p5 R& r/ K" P0 G
}: k6 W. p; c/ X& M  M
return ( crc);
" u' M/ t$ {9 ^6 \
8 v9 n* A+ j: s}0 G: _: ~0 W( O/ G% l: x( g
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
& l) Z1 O; W2 I$ K, m$ D" gcrc校验有两种方式的,一种是计算法,还有一种是恶心的查表法。

" U3 v8 P+ i7 ~6 b; O我用的就是恶心的查表法,# O. w# |  E# l: u
& L8 R& A) P9 |" U( ?
不过,查表比较计算的要快,我倾向于查表$ k  u5 t# G& z: M" E: K$ J6 u

0 G5 f2 c1 `$ V- J+ K3 k( 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:54
: r/ F) _  }3 Q! g2 e+ D7 Q, {/*modbus CRC16& H9 D) H, E) y1 {( |- ?/ G
生成  CRC  的过程为: 6 s, S7 I- S9 r1 ]1 q' J
1. 将一个  16 位寄存器(称作  CRC 寄存器)初始赋值为十六进制  F ...
$ L% E/ }9 ~: h" I  M, J- c
顶,有理论,有代码
土司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 编辑
4 y& ~4 p6 V. `/ t0 ~3 G6 M9 J4 ?9 ?
土司Apple 发表于 2018-5-30 14:428 P. [2 z2 a- C2 u: S
CRC的多项式为什么是同0xA001异或而不是0x8005呢??

4 r: u1 Q2 X! x/ i你看他用的是右移,一般我们用0x8005实现的时候,用的都是左移。4 R  F8 W% _1 K" R# t/ F. M! c* ]
0x A001 =1010 0000 0000 0001B
% ?' Z7 N& b( m' r: G( p反过来写就是:1000 0000 0000 0101B=0x8005
0 ?8 y2 G4 ]( j
STM1024 回答时间:2018-6-11 17:43:14
这个……犯得着大动干戈么,一堆现成的代码可以用啊
12下一页

所属标签

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