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

分享一个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) h8 Z7 J' o2 b; p
生成  CRC  的过程为:
% o. f3 \& @8 F% B1. 将一个  16 位寄存器(称作  CRC 寄存器)初始赋值为十六进制  FFFF (全 1);
1 t3 h" Q7 ?$ ]! E2 M# d# [2. 将报文的第一个字节( 8位)与 16 位 CRC 寄存器的低字节异或,结果置于 CRC 寄存器;
$ h, i8 Q% a- |) g- l0 u3. 将  CRC 寄存器右移 1位  (向  LSB 方向), MSB 充零,并检测  LSB:
2 k8 ~4 X  }1 c8 Z3 I4. (如果 LSB(移出来的那一位) 为  0): 重复步骤  3 (另一次移位).   (如果 LSB 为 1): 对 CRC 寄存器异或多项式值  0xA001 (1010 0000 0000 0001). + i% W. @' J0 ?$ j
5. 重复步骤  3 和 4,直到完成  8 次移位操作后,一个字节的处理完毕。 . y- E4 Q6 }" P/ O
6. 对报文中的下一个字节重复步骤 2 到 5继续此操作,直至所有报文被处理完毕。 ; v6 s' g/ c2 E- n  F* m& W
7. CRC 寄存器中的最终值为 CRC 值. 8. 当放置 CRC 值于报文时,注意高低字节必须交换。
! u0 }+ {$ m- d- X* [*/
" I( s) N) n+ {% I  Punsigned int CRC16 ( uchar *arr_buff, uchar len)
9 J3 T* J5 X& k6 x% z{- _9 K( B7 @$ D

, r7 i4 q( l' t' I* \6 k  \% E uint crc=0xFFFF;: d. }. |; G" ^/ g
uchar i, j, Data;
( Y" O) K& B% e+ r" i for ( j=0; j < len;j++ )+ l! i3 b+ ]( o$ E. a
{
, ?+ R- z" X% v7 i; J& a
3 _2 L& L/ E1 t- C9 u$ {9 J   crc=crc ^*arr_buff++;
3 k( j" j' z, h* H1 t   for ( i=0; i<8; i++)6 |0 }" ]( I7 S% P/ w; |4 B
  {# I! r- F0 `8 p0 D% J4 \& R/ E* Z

" d% x4 d& q1 B* J' G       if( ( crc&0x0001) >0)7 K# F/ c. {* s$ c! \
" L! ^; w' Z, R* P( u5 m( Z, i) |
       {6 r( b/ k5 q" Y0 r8 i' k' y
# w! N' T5 S5 ^5 w
           crc=crc>>1;8 S4 |9 p$ \+ v

2 B* @+ ?! N: j           crc=crc^ 0xa001;0 h2 L4 s6 R) ?, C  P1 }0 M" q
+ w# e. M. t0 J# P' x8 g6 ^
        }
/ S9 r/ K6 a5 H1 I& p; |' _7 M      else
: A. U* H$ f1 R- K* m" h# e5 b2 j8 V' `
          crc=crc>>1;
* O; U8 D% j/ c8 T   }
; y. l9 N! S, E( d6 m }2 p9 X* v! ~4 J) c
return ( crc);
0 |  r* U0 i8 y/ I$ i5 q( a* P* y: F* B
) B! i; A. g6 K! k' j1 F  p}4 [) e" x: j5 S- I& k
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' \+ h: H- ^/ u$ E! r- s% x- C
crc校验有两种方式的,一种是计算法,还有一种是恶心的查表法。
! ?2 P4 l: w- }% V* \( M0 t7 b
我用的就是恶心的查表法,
7 W  F. t- A  {& b- \+ Q
( g4 d) V. d( `6 O! O不过,查表比较计算的要快,我倾向于查表* R$ C5 o+ _$ D$ R5 O) z# j
3 L: A& V/ Z8 n/ @" l3 D
另外,封装起来调用就省事儿一些,感觉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 J5 x3 {8 A5 Z5 C
/*modbus CRC16
) P- ~& x' k* {0 |% Z+ R3 B生成  CRC  的过程为:
, i, F0 `  G9 [, a) ]4 P1. 将一个  16 位寄存器(称作  CRC 寄存器)初始赋值为十六进制  F ...
, C1 R/ r' I3 a3 U: W1 q3 r) H
顶,有理论,有代码
土司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 a! M( y' X' B: ?1 P- v* A5 n" d
土司Apple 发表于 2018-5-30 14:42
$ l* L1 v% N+ BCRC的多项式为什么是同0xA001异或而不是0x8005呢??

+ X" Z! e5 [; l7 U你看他用的是右移,一般我们用0x8005实现的时候,用的都是左移。
0 h  n6 d% M% ]1 U0x A001 =1010 0000 0000 0001B
& \1 l7 J' i% y" p, K" T8 G) e$ `反过来写就是:1000 0000 0000 0101B=0x8005  Q7 I- _$ r& Z/ W8 c
STM1024 回答时间:2018-6-11 17:43:14
这个……犯得着大动干戈么,一堆现成的代码可以用啊
12下一页

所属标签

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