Coding

CRC

循环冗余码校验,英文名称为Cyclical Redundancy Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

根据应用环境与习惯的不同,CRC又可分为以下几种标准:
  1、CRC-12码;
  2、CRC-16码;
  3、CRC-CCITT码;
  4、CRC-32码。

CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。下面以最常用的CRC-16为例来说明其生成过程。

CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出CRC寄存器)如果为1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,则无需进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的字符处理完成后CRC寄存器内的值即为最终的CRC值。

下面为CRC的计算过程:
  1.设置CRC寄存器,并给其赋值FFFF(hex)。
  2.将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。
  3.CRC寄存器向右移一位,MSB补零,移出并检查LSB。
  4.如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。
  5.重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。
  6.重复第2至第5步直到所有数据全部处理完成。
  7.最终CRC寄存器的内容即为CRC值。

常用的CRC循环冗余校验标准多项式如下:
  CRC(16位) = X16+X15+X2+1
  CRC(CCITT) = X16+X12 +X5+1
  CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1

以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。

注意:这儿列出的标准校验多项式都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。(注:对二取模的四则运算指参与运算的两个二进制数各位之间凡涉及加减运算时均进行XOR异或运算,即:1 XOR 1=0,0 XOR 0=0,1 XOR 0=1)

评论

几种求CRC-CCITT的方法 [C/C#]

评论

趋势项和直流分量

趋势项和直流分量两者都是慢变成分,一般认为是仪器漂移所导致,所以在数据处理的时候经常要去掉。直流分量就是认为这个漂移不随时间发生变化,因此去零或去直流。而慢变的漂移就是所谓趋势项,一般通过曲线拟合(短数据),或高通滤波来消除(长数据)。当然,消除趋势项的算法肯定能去直流。

趋势项:在振动测试中采集到的振动信号数据,由于放大器随温度变化产生的零点漂移、传感器频率范围外低频性能的不稳定以及传感器周围的环境干扰等,往往会偏离基线,甚至偏离基线的大小还会随时间变化。偏离基线随时间变化的整个过程被称为信号的趋势项

评论

使用sfr16引起的小问题。。。

使用KEILC编程时喜欢用sfr16来定义一些16位寄存器,或者把两个8位寄存器用一个标识符来识别。比如:

  1. sfr TMR2L         = 0xCC; /* TIMER/COUNTER 2 LOW */
  2. sfr TMR2H         = 0xCD; /* TIMER/COUNTER 2 HIGH */
  3. TMR2L = 0x34;
  4. TMR2H = 0x12;

可以用

  1. sfr16 TMR2DATA         = 0xCC; /* TIMER/COUNTER 2 LOW */
  2. TMR2DATA = 0x1234;

来代替。

但是昨天头一发晕看到sfr TL0 = 0×8A;就随手定义了一个sfr16 TMR0DATA = 0×8A来代替。T0用于定时,T1给Uart0提供波特率支持,结果串口数据乱七八糟,查了半天怀疑到这个定义上,仔细看了下datasheet,我晕,原来是这样定义的:

  1. sfr TL0           = 0x8A; /* TIMER/COUNTER 0 LOW */
  2. sfr TL1           = 0x8B; /* TIMER/COUNTER 1 LOW */
  3. sfr TH0           = 0x8C; /* TIMER/COUNTER 0 HIGH */
  4. sfr TH1           = 0x8D; /* TIMER/COUNTER 1 HIGH */

如果用TMR0DATA = 0×1234的话,就相当于TL0 = 0×34,TL1 = 0×12,大拍脑门,太想当然了。。。乖乖的用TH0,TL0来赋值了,串口问题随即解决。

评论

[C#]使用msagent朗读英文文本

msagent就是office里面的那个助手精灵,可以利用它朗读英文文本。

本文基于VS2005,其他IDE类推。首先在[工具]-[选择工具箱项]-[COM组件]里选择Microsoft Agent Control 2.0,将msagent放到工具箱里,然后就可以把它拖放到窗体上,命名为axAgent1。

之后在代码里添加

  1. AgentObjects.IAgentCtlCharacterEx Character;
  2. AgentObjects.IAgentCtlRequest Request;
  3.  
  4. string file = @"C:\WINDOWS\msagent\chars\Genie.acs";
  5. Request = this.axAgent1.Characters.Load("Chart1", file);
  6. Character = this.axAgent1.Characters["Chart1"];
  7. Character.Show(false);
  8. Character.SoundEffectsOn = true;
  9.  
  10. Character.LanguageID = 0x409;   //把语言设置为英语,这里不能是中文
  11. Character.Speak(textBox_Output.Text, null);   //让助手精灵朗读textBox_Output控件里的文本

之后,就可以发音啦。不过只能读英文,要朗读中文,需要安装SAPI,在这里下载:http://www.microsoft.com/downloads/details.aspx?FamilyID=5e86ec97-40a7-453f-b0ee-6583171b4530&DisplayLang=en#filelist

值得注意的是,只有windows自带的agent可以发音,office里面的好像不能,这个问题曾困惑了我一下午,T.T

评论

Page 1 of 3123»