搜索
bottom↓
回复: 79

CRC大全以及CRC16代码,针对单片机优化了的

[复制链接]

出0入0汤圆

发表于 2005-6-28 10:30:34 | 显示全部楼层 |阅读模式
网站上的算法大都是查512字节表的,对单片机来讲,太浪费空间了。

根据老古网上资料,修改并测试通过以下算法:

unsigned int crc_ta[16]={

0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,

0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,

};



unsigned int Crc16(unsigned char *ptr, unsigned char len)

{

unsigned int crc;

unsigned char da;



crc=0;

while(len--!=0)

{

   da=crc>>12;

   crc<<=4;

   crc^=crc_ta[da^(*ptr/16)];

                              

   da=crc>>12;

   crc<<=4;

   crc^=crc_ta[da^(*ptr&0x0f)];

   ptr++;

}

return(crc);

}



以下是资料和代码:

点击此处下载armok0154567.rar

出0入0汤圆

发表于 2005-6-28 12:19:47 | 显示全部楼层
我推荐一个简单的

unsigned int fcs_calc(unsigned char *pr)  /* CRC16.c */

{ unsigned int number_of_databytes;

  unsigned int calculate_or_check_crc;

  unsigned int i, j;

  unsigned int fcs;

  number_of_databytes =UsbLength;

  calculate_or_check_crc = CALC_CRC;

  if(calculate_or_check_crc == CALC_CRC)

  { number_of_databytes = UsbLength;  /* 数组长 */

  }

  else    /* check CRC */

  { number_of_databytes = UsbLength + 2;

  }

  fcs = PRESET_VALUE;

  for(i = 1; i < number_of_databytes; i++)

  { fcs = fcs ^ ((unsigned int)(pr));

    for (j = 0; j < 8; j++)

    { if (fcs & 0x0001)

      { fcs = (fcs >> 1) ^ POLYNOMIAL;

      }

      else

      { fcs = (fcs >> 1);

      }

    } /* for j */

  } /* for i */

  fcs = ~fcs;

  return(fcs);

} /* fcs_calc */

出0入0汤圆

 楼主| 发表于 2005-6-28 13:01:53 | 显示全部楼层
1位1位移位,速度会慢些,我也是比较各种算法后推荐上述算法的

出0入0汤圆

发表于 2005-6-28 14:02:27 | 显示全部楼层
WinAVR\avr\include\avr\crc16.h

出0入0汤圆

发表于 2005-6-28 14:27:34 | 显示全部楼层
【1楼】的太慢了!! 樓主的方法好!

出0入0汤圆

发表于 2005-6-28 15:25:13 | 显示全部楼层
仔细看看 WinAVR\avr\include\avr\crc16.h 再来说。

出0入0汤圆

发表于 2005-6-29 11:52:59 | 显示全部楼层
先谢谢了!

出0入0汤圆

发表于 2006-3-27 13:54:24 | 显示全部楼层
谢了

出0入0汤圆

发表于 2006-8-13 16:14:20 | 显示全部楼层
我还是喜欢512字节表的,偶的PC机也用同样的算法。

出0入4汤圆

发表于 2006-8-14 14:06:12 | 显示全部楼层
俺用128的多,flash一般只用1/4,3/4都是浪费

出0入0汤圆

发表于 2006-8-16 20:58:28 | 显示全部楼层
__inline__ uint16_t _crc_ccitt_update  (  uint16_t  __crc,  

  uint8_t  __data

)  [static]



   Optimized CRC-CCITT calculation.

Polynomial: x^16 + x^12 + x^5 + 1 (0x8408)   //0x8408这是怎么得到的数?

Initial value: 0xffff





    uint16_t

    crc_ccitt_update (uint16_t crc, uint8_t data)

    {

        data ^= lo8 (crc);

        data ^= data << 4;

        return ((((uint16_t)data << 8) | hi8 (crc)) ^ (uint8_t)(data >> 4)

                ^ ((uint16_t)data << 3));

    }



在用crc校验的时候,我应该怎样调用这个函数?uint16_t crc 的位置在实参中应该是个什么数?

出0入0汤圆

发表于 2007-3-17 16:30:41 | 显示全部楼层
void crc16(unsigned char r_data[],unsigned int length)

{

    unsigned char cl,ch;

        unsigned char savehi,savelo;

        int ii,flag;

        crc16hi=0xFF;

        crc16lo=0xFF;

        cl=0x1;

        ch=0xA0;

        for (ii=0;ii<length-2;ii++)

        {

            crc16lo=(crc16lo ^ r_data[ii]);

                for (flag=0;flag<8;flag++)

                {

                        savehi=crc16hi;

                        savelo=crc16lo;

                        crc16hi=(crc16hi>>1);

                        crc16lo=(crc16lo>>1);

                        if ((savehi & 0x01)==0x01)

                                crc16lo=(crc16lo | 0x80);

                        if        ((savelo & 0x01)==0x01)

                        {

                                crc16hi = (crc16hi ^ ch);

                                crc16lo = (crc16lo ^ cl);

                        }       

                }

        }

}

出0入0汤圆

发表于 2007-3-18 13:04:01 | 显示全部楼层
感谢,是一下,我用的是最笨蛋的方法:)



顶帖光荣!!!!

出0入4汤圆

发表于 2007-3-19 16:24:28 | 显示全部楼层
直接作运算比查表慢不到哪里去,用AS软件仿真可以看到运行的步数

出0入0汤圆

发表于 2008-1-16 19:05:20 | 显示全部楼层
俺是新手,也想用avr上的crc,多谢楼主的共享。

有一个问题:
>>    crc^=crc_ta[da^(*ptr/16)];

既然效率很重要,这一句能否写成
    crc^=crc_ta[da^((*ptr) >> 4)];

如果用右移代替除法,应该能节省一点时钟周期吧

出0入0汤圆

发表于 2008-1-16 20:09:26 | 显示全部楼层
可以的,效果也是一样的,没有节省时钟周期的,你是新手编译器可不是新手。

出0入0汤圆

发表于 2008-5-30 16:59:44 | 显示全部楼层
楼主用的是半字节方式,是位方式和字节方式CRC编码的折中

出0入0汤圆

发表于 2008-5-30 20:12:14 | 显示全部楼层
我用的是查表法 mega128 那么大的空间 呵呵

出0入46汤圆

发表于 2008-5-30 20:51:28 | 显示全部楼层
CRC在单片机中应用在哪方面?能举些例子吗?

出0入0汤圆

发表于 2008-5-30 20:55:57 | 显示全部楼层
学习了!!!

出0入0汤圆

发表于 2008-5-30 21:16:25 | 显示全部楼层
学习下

出0入0汤圆

发表于 2008-5-30 23:57:45 | 显示全部楼层
留个记号

出0入0汤圆

发表于 2008-5-31 01:49:22 | 显示全部楼层
脚丫

出0入0汤圆

发表于 2008-6-16 19:23:40 | 显示全部楼层
路过。留个脚印!

出0入0汤圆

发表于 2008-6-16 21:56:42 | 显示全部楼层
记号 很需要这个 多谢

出0入0汤圆

发表于 2008-6-17 01:14:18 | 显示全部楼层
这个是半字查表法的.

出0入0汤圆

发表于 2008-6-20 13:03:55 | 显示全部楼层
没搞过,学习。

出0入0汤圆

发表于 2008-6-27 11:51:32 | 显示全部楼层
测试了搂住的CRC16
好像得出得数值不对啊
例如:输入3位 0x01 0x02 0x03  结果是0x6131
而正确的是0x6161
不知道是什么问题了

出0入0汤圆

发表于 2008-6-27 13:47:02 | 显示全部楼层
研究研究,。

出0入0汤圆

发表于 2008-6-27 14:31:48 | 显示全部楼层
《循环冗余校验 CRC 的算法分析和程序实现》

西南交通大学计算机与通信工程学院 刘东

摘要 通信的目的是要把信息及时可靠地传送给对方,因此要求一个通信系统传输消息必须可靠
与快速,在数字通信系统中可靠与快速往往是一对矛盾。为了解决可靠性,通信系统都采用了差错
控制。本文详细介绍了循环冗余校验CRC(Cyclic Redundancy Check)的差错控制原理及其算法实
现。

关键字 通信 循环冗余校验 CRC-32 CRC-16 CRC-4

概述
在数字通信系统中可靠与快速往往是一对矛盾。若要求快速,则必然使得每个数据码元所占地
时间缩短、波形变窄、能量减少,从而在受到干扰后产生错误地可能性增加,传送信息地可靠性下
降。若是要求可靠,则使得传送消息地速率变慢。因此,如何合理地解决可靠性也速度这一对矛盾,
是正确设计一个通信系统地关键问题之一。为保证传输过程的正确性,需要对通信过程进行差错控
制。差错控制最常用的方法是自动请求重发方式(ARQ)、向前纠错方式(FEC)和混合纠错(HEC)。
在传输过程误码率比较低时,用FEC 方式比较理想。在传输过程误码率较高时,采用FEC 容易出
现“乱纠”现象。HEC 方式则式ARQ 和FEC 的结合。在许多数字通信中,广泛采用ARQ 方式,
此时的差错控制只需要检错功能。实现检错功能的差错控制方法很多,传统的有:奇偶校验、校验
和检测、重复码校验、恒比码校验、行列冗余码校验等,这些方法都是增加数据的冗余量,将校验
码和数据一起发送到接受端。接受端对接受到的数据进行相同校验,再将得到的校验码和接受到的
校验码比较,如果二者一致则认为传输正确。但这些方法都有各自的缺点,误判的概率比较高。
循环冗余校验CRC(Cyclic Redundancy Check)是由分组线性码的分支而来,其主要应用是二
元码组。编码简单且误判概率很低,在通信系统中得到了广泛的应用。下面重点介绍了CRC 校验
的原理及其 算法实现。
一、循环冗余校验码(CRC)
CRC 校验采用多项式编码方法。被处理的数据块可以看作是一个n 阶的二进制多项式,由
1 0
2
2
1
1 a x a x x a x a
n
n
n + &#8722; + &#8901; &#8901; &#8901; + +
&#8722;
&#8722;
&#8722; 。如一个8 位二进制数10110101 可以表示为:
1x7 + 0x6 +1x5 +1x4 + 0x3 +1x2 + 0x +1。多项式乘除法运算过程与普通代数多项式的乘除法相
同。多项式的加减法运算以2 为模,加减时不进,错位,和逻辑异或运算一致。
采用CRC 校验时,发送方和接收方用同一个生成多项式g(x),并且g(x)的首位和最后一
位的系数必须为1。CRC 的处理方法是:发送方以g(x)去除t(x),得到余数作为CRC 校验码。
校验时,以计算的校正结果是否为0 为据,判断数据帧是否出错。
CRC 校验可以100%地检测出所有奇数个随机错误和长度小于等于k(k 为g(x)的阶数)的
突发错误。所以CRC 的生成多项式的阶数越高,那么误判的概率就越小。CCITT 建议:2048 kbit/s
的PCM 基群设备采用CRC-4 方案,使用的CRC 校验码生成多项式g(x)= x4 + x +1。采用16
位CRC 校验,可以保证在1014 bit 码元中只含有一位未被检测出的错误[2] 。在IBM 的同步数据链
路控制规程SDLC 的帧校验序列FCS 中,使用CRC-16,其生成多项式g(x)= x16 + x15 + x2 +1;
而在CCITT 推荐的高级数据链路控制规程HDLC 的帧校验序列FCS 中,使用CCITT-16,其生成多
项式g ( x ) = x16 + x15 + x5 +1 。CRC-32 的生成多项式g ( x )
= x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x +1。CRC-32 出错的概
率比CRC-16 低10&#8722;5 倍[4] 。由于CRC-32 的可靠性,把CRC-32 用于重要数据传输十分合适,所以
在通信、计算机等领域运用十分广泛。在一些UART通信控制芯片(如MC6582、Intel8273 和Z80-SIO)
内,都采用了CRC 校验码进行差错控制;以太网卡芯片、MPEG 解码芯片中,也采用CRC-32 进
行差错控制。
二、CRC 校验码的算法分析
CRC 校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数
作为CRC 校验码。其实现步骤如下:
(1) 设待发送的数据块是m 位的二进制多项式t(x),生成多项式为r 阶的g(x)。在数据块
的末尾添加r 个0,数据块的长度增加到m+r 位,对应的二进制多项式为xr t(x) 。
(2) 用生成多项式g(x)去除xr t(x) ,求得余数为阶数为r-1 的二进制多项式y(x)。此二进
制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC 校验码。
(3) 用xr t(x) 以模2 的方式减去y(x),得到二进制多项式xr t'(x) 。xr t'(x) 就是包含了CRC
校验码的待发送字符串。
从CRC 的编码规则可以看出,CRC 编码实际上是将代发送的m 位二进制多项式t(x)转换成
了可以被g(x)除尽的m+r 位二进制多项式xr t'(x) ,所以解码时可以用接受到的数据去除g(x),
如果余数位零,则表示传输过程没有错误;如果余数不为零,则在传输过程中肯定存在错误。许多
CRC 的硬件解码电路就是按这种方式进行检错的。同时xr t'(x) 可以看做是由t(x)和CRC 校验码
的组合,所以解码时将接收到的二进制数据去掉尾部的r 位数据,得到的就是原始数据。
为了更清楚的了解CRC 校验码的编码过程,下面用一个简单的例子来说明CRC 校验码的编码
过程。由于CRC-32、CRC-16、CCITT 和CRC-4 的编码过程基本一致,只有位数和生成多项式不
一样。为了叙述简单,用一个CRC-4 编码的例子来说明CRC 的编码过程。
设待发送的数据t(x)为12 位的二进制数据100100011100;CRC-4 的生成多项式为g(x)
= x4 + x +1,阶数r 为4,即10011。首先在t(x)的末尾添加4 个0 构成x4t(x) ,数据块就成了
1001000111000000。然后用g(x)去除x4t(x) ,不用管商是多少,只需要求得余数y(x)。下表为
给出了除法过程。
从上面表中可以看出,CRC 编码实际上是一个循环移位的模2 运算。对CRC-4,我们假设有
除数次数
被除数/ g(x)/结果
余数
1 001000111000000
1 0011
0
0 000100111000000
100111000000
1 00111000000
1 0011
1
0 00001000000
1000000
1 000000
1 0011
2
0 001100
1100
一个5 bits 的寄存器,通过反复的移位和进行CRC 的除法,那么最终该寄存器中的值去掉最高一位
就是我们所要求的余数。所以可以将上述步骤用下面的流程描述:
//reg 是一个5 bits 的寄存器
把reg 中的值置0.
把原始的数据后添加r 个0.
While (数据未处理完)
Begin
If (reg 首位是1)
reg = reg XOR 0011.
把reg 中的值左移一位,读入一个新的数据并置于register 的0 bit 的位置。
End
reg 的后四位就是我们所要求的余数。
这种算法简单,容易实现,对任意长度生成多项式的G(x)都适用。在发送的数据不长的情
况下可以使用。但是如果发送的数据块很长的话,这种方法就不太适合了。它一次只能处理一位数
据,效率太低。为了提高处理效率,可以一次处理4 位、8 位、16 位、32 位。由于处理器的结构基
本上都支持8 位数据的处理,所以一次处理8 位比较合适。
为了对优化后的算法有一种直观的了解,先将上面的算法换个角度理解一下。在上面例子中,
可以将编码过程看作如下过程:
由于最后只需要余数,所以我们只看后四位。构造一个四位的寄存器reg,初值为0,数据依
次移入reg0(reg 的0 位),同时reg3 的数据移出reg。有上面的算法可以知道,只有当移出的数据
为1 时,reg 才和g(x)进行XOR 运算;移出的数据为0 时,reg 不与g(x)进行XOR 运算,相
当与和0000 进行XOR 运算。就是说,reg 和什么样的数据进行XOR 移出的数据决定。由于只有一
个bit,所以有21 种选择。上述算法可以描述如下,
//reg 是一个4 bits 的寄存器
初始化t[]={0011,0000}
把reg 中的值置0.
把原始的数据后添加r 个0.
While (数据未处理完)
Begin
把reg 中的值左移一位,读入一个新的数据并置于register 的0 bit 的位置。
reg = reg XOR t[移出的位]
End
上面算法是以bit 为单位进行处理的,可以将上述算法扩展到8 位,即以Byte 为单位进行处理,
即CRC-32。构造一个四个Byte 的寄存器reg,初值为0x00000000,数据依次移入reg0(reg 的0
字节,以下类似),同时reg3 的数据移出reg。用上面的算法类推可知,移出的数据字节决定reg 和
什么样的数据进行XOR。由于有8 个bit,所以有28 种选择。上述算法可以描述如下:
//reg 是一个4 Byte 的寄存器
初始化t[]={…}//共有28 =256 项
把reg 中的值置0.
把原始的数据后添加r/8 个0 字节.
While (数据未处理完)
Begin
把reg 中的值左移一个字节,读入一个新的字节并置于reg 的第0 个byte 的位置。
reg = reg XOR t[移出的字节]
End
算法的依据和多项式除法性质有关。如果一个m 位的多项式t(x)除以一个r 阶的生成多项式
g(x), 0
1
1
2
2
2
2
1
t(x) a 1x a xm a x a x a
m
m
m = + &#8722; + &#8901; &#8901; &#8901; + + +
&#8722;
&#8722;
&#8722; ,将每一位k
k a x (0=<k<m)提出来,
在后面不足r 个0 后,单独去除g(x),得到的余式位y (x) k 。则将( ) ( ) ( ) 1 2 0 y x y x y x m m ♁ ♁ &#8901; &#8901; &#8901; ♁ &#8722; &#8722;
后得到的就是t(x)由生成多项式g(x)得到的余式。对于CRC-32,可以将每个字节在后面补上
32 个0 后与生成多项式进行运算,得到余式和此字节唯一对应,这个余式就是上面算法种t[]中的
值,由于一个字节有8 位,所以t[]共有28 =256 项。多项式运算性质可以参见参考文献[1]。这种
算法每次处理一个字节,通过查表法进行运算,大大提高了处理速度,故为大多数应用所采用。
三、CRC-32 的程序实现。
为了提高编码效率,在实际运用中大多采用查表法来完成CRC-32 校验,下面是产生CRC-32
校验吗的子程序。
unsigned long crc_32_tab[256]={
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535,
0x9e6495a3,0x0edb8832,…, 0x5a05df1b, 0x2d02ef8d
};//事先计算出的参数表,共有256 项,未全部列出。
unsigned long GenerateCRC32(char xdata * DataBuf,unsigned long len)
{
unsigned long oldcrc32;
unsigned long crc32;
unsigned long oldcrc;
unsigned int charcnt;
char c,t;
oldcrc32 = 0x00000000; //初值为0
charcnt=0;
while (len--) {
t= (oldcrc32 >> 24) & 0xFF; //要移出的字节的值
oldcrc=crc_32_tab[t]; //根据移出的字节的值查表
c=DataBuf[charcnt]; //新移进来的字节值
oldcrc32= (oldcrc32 << 8) | c; //将新移进来的字节值添在寄存器末字节中
oldcrc32=oldcrc32^oldcrc; //将寄存器与查出的值进行xor 运算
charcnt++;
}
crc32=oldcrc32;
return crc32;
}
参数表可以先在PC 机上算出来,也可在程序初始化时完成。下面是用于计算参数表的c 语言
子程序,在Visual C++ 6.0 下编译通过。
#include <stdio.h>
unsigned long int crc32_table[256];
unsigned long int ulPolynomial = 0x04c11db7;
unsigned long int Reflect(unsigned long int ref, char ch)
{ unsigned long int value(0);
// 交换bit0 和bit7,bit1 和bit6,类推
for(int i = 1; i < (ch + 1); i++)
{ if(ref & 1)
value |= 1 << (ch - i);
ref >>= 1; }
return value;
}
init_crc32_table()
{ unsigned long int crc,temp;
// 256 个值
for(int i = 0; i <= 0xFF; i++)
{ temp=Reflect(i, 8);
crc32_table= temp<< 24;
for (int j = 0; j < 8; j++){
unsigned long int t1,t2;
unsigned long int flag=crc32_table&0x80000000;
t1=(crc32_table << 1);
if(flag==0)
t2=0;
else
t2=ulPolynomial;
crc32_table =t1^t2 ; }
crc=crc32_table;
crc32_table = Reflect(crc32_table, 32);
}
}
结束语
CRC 校验由于实现简单,检错能力强,被广泛使用在各种数据校验应用中。占用系统资源
少,用软硬件均能实现,是进行数据传输差错检测地一种很好的手段。
参考文献
[1] 王新梅 肖国镇. 纠错码-原理与方法.西安:西安电子科技大学出版社,2001
[2] 罗伟雄 韩力 原东昌 丁志杰 通信原理与电路. 北京:北京理工大学出版社,1999
[3] 王仲文 ARQ 编码通信.北京:机械工业出版社,1991
[4] Ross Williams, A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS.
Document url: http://www.repairfaq.org/filipg/ ,1993

出0入0汤圆

发表于 2008-6-27 14:33:22 | 显示全部楼层
make

出0入0汤圆

发表于 2008-6-27 15:25:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-6-27 17:51:38 | 显示全部楼层
有空研究

出0入0汤圆

发表于 2008-6-29 10:32:59 | 显示全部楼层
不错!我正想找呢!没想到到这里找到了!谢谢大家!收藏了!下去研究研究!

出0入0汤圆

发表于 2008-7-14 12:28:21 | 显示全部楼层
对于AVR来说,用查表法是比较好!本身资源足够,用这样的方法用的时间是最少的.

出0入0汤圆

发表于 2008-7-14 13:41:34 | 显示全部楼层
先收藏,有时间研究下

出0入0汤圆

发表于 2008-7-14 22:08:54 | 显示全部楼层
收藏

出0入0汤圆

发表于 2009-10-16 09:52:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-9 16:33:04 | 显示全部楼层
非常感谢!

出0入0汤圆

发表于 2010-1-9 17:43:40 | 显示全部楼层
MARK CRC

出0入0汤圆

发表于 2010-4-22 11:57:21 | 显示全部楼层

出0入0汤圆

发表于 2010-4-22 14:01:07 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-5-26 21:21:29 | 显示全部楼层
MARK crc

出0入0汤圆

发表于 2010-5-27 12:08:29 | 显示全部楼层
顶楼主

出0入0汤圆

发表于 2010-5-27 13:58:56 | 显示全部楼层
正需要,mark..

出0入0汤圆

发表于 2010-5-27 14:30:55 | 显示全部楼层
mark, 常用的算法

出0入0汤圆

发表于 2010-5-27 14:32:06 | 显示全部楼层
高手真多

出0入0汤圆

发表于 2010-7-1 16:44:43 | 显示全部楼层
强贴要支持

出0入0汤圆

发表于 2010-7-1 17:26:42 | 显示全部楼层
mark CRC

出0入0汤圆

发表于 2010-7-14 12:44:20 | 显示全部楼层
m

出0入0汤圆

发表于 2010-8-15 14:59:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-15 15:24:09 | 显示全部楼层
mark CRC16

出0入0汤圆

发表于 2010-8-15 22:43:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-27 09:46:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-23 23:12:52 | 显示全部楼层
MM

出0入0汤圆

发表于 2011-6-25 20:20:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-25 22:25:31 | 显示全部楼层
mark CRC16
但是标题来个大全。大全呢?

出0入0汤圆

发表于 2011-6-25 22:53:21 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-25 23:10:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-26 01:20:44 | 显示全部楼层
mark。。。一直没看懂那个计算公式,受挫啊。。。

出0入0汤圆

发表于 2011-6-26 10:45:13 | 显示全部楼层
标记下

出0入0汤圆

发表于 2011-6-26 15:04:28 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-27 17:54:58 | 显示全部楼层
CRC16 标记下

出0入0汤圆

发表于 2011-9-28 16:46:20 | 显示全部楼层
CRC16

出0入0汤圆

发表于 2011-9-28 16:55:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-10 11:28:26 | 显示全部楼层
大全来了:

常用CRC生成多项式ourdev_693751VO793F.xls(文件大小:24K) (原文件名:CRC国际通用校验多项式.xls)

出0入0汤圆

发表于 2011-11-10 12:20:48 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-12 20:32:35 | 显示全部楼层
讲得不错,学习了

出0入0汤圆

发表于 2011-11-21 10:56:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-21 11:20:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-21 12:29:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-21 17:23:23 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-21 17:35:32 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-11-22 14:32:51 | 显示全部楼层
回复【楼主位】pei99888  
-----------------------------------------------------------------------

51用Modbus的话还是有用

出0入0汤圆

发表于 2011-11-25 15:17:34 | 显示全部楼层
这个正好用的到,谢谢!

出0入0汤圆

发表于 2012-1-4 21:17:54 | 显示全部楼层
mark 学习

出0入59汤圆

发表于 2012-1-4 21:55:55 | 显示全部楼层
好东西,留用,谢谢

出0入0汤圆

发表于 2012-1-13 13:23:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-5-21 17:05:34 | 显示全部楼层
好像计算不对大家有没发觉

出0入0汤圆

发表于 2012-5-21 21:00:08 | 显示全部楼层
正在study.多谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 04:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表