标题: [求助]哪位高手能提供CRC-CCITT的C语言程序么
magic_mage
新手上路
Rank: 1



UID 5404
精华 0
积分 22
帖子 22
阅读权限 10
注册 2005-5-19
发表于 2005-5-19 10:34  资料  短消息  加为好友 
[求助]哪位高手能提供CRC-CCITT的C语言程序么

计算CRC-CCITT的函数都要自己编么,难道没有专用C函数么
还有,当用422串行传输数据时,怎么用软件实现在连续的5个1后插入1个0?我知道好象硬件上比较容易实现,网络芯片已经提供了此功能,但怎么用软件实现呢,串口传输不都是以字节为单位的么,如果在1byte里插如1bit,那多出来的bit放在哪里呢,有专用的C函数么

顶部
[广告] SETI@home Astropulse 优化计算程序,推荐使用!
碧城仙
管理员
Rank: 7Rank: 7Rank: 7Rank: 7



UID 403
精华 55
积分 8858
帖子 8144
阅读权限 102
注册 2004-1-24
来自 华东理工大学
发表于 2005-5-22 19:20  资料  主页 短消息  加为好友  QQ
参见帖子:http://www.equn.com/forum/viewthread.php?tid=5470


1) 求CRC码的运算采用模2运算, 所谓模2运算就是不带进位和借位, 因此加法和减法等价,实际上就是逻辑上的异或运算, 除法可以用多次模2减法实现.

2) 所谓CRC码, 就是把数据块左移16位, 然后除以0x11021所得到的余数(由CCITT推荐).

3) 据此写出以下的CRC的C程序. *ptr指向发送数据块的首地址, len是数据块以字节为单位的长度.

uint cal_crc(uchar *ptr, uchar len) {
uint crc;
uchar i;

crc=0;
while(len--!=0) {
for(i=0x80; i!=0; i/=2) {
if((crc&0x8000)!=0) {crc*=2; crc^=0x1021;}
else crc*=2;
if((*ptr&i)!=0) crc^=0x1021;
}
ptr++;
}
return(crc);
}





快是快乐的一半,快乐才是计算的全部。
癌症研究相关项目:Folding@home、Rosetta@home、Help Conquer Cancer(WCG)、Cels@Home
顶部
magic_mage
新手上路
Rank: 1



UID 5404
精华 0
积分 22
帖子 22
阅读权限 10
注册 2005-5-19
发表于 2005-5-25 14:12  资料  短消息  加为好友 
太谢谢啦

顶部
 



当前时区 GMT+8, 现在时间是 2008-11-22 23:49
沪ICP备05042587号

本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 © 2001-2007 Comsenz Inc.
清除 Cookies - 联系我们 - 中国分布式计算总站 - Archiver - WAP