数字信号在传输时难免会受到噪声干扰,引起波形失真,因而在接收端可能做出错误判决,将某一码元“0”错判为“1”,或将“1”错判为“0”,从而造成错码。一个可靠的通信系统必须有检测和纠正这种错误的机制。差错控制技术是采用可靠、有效的编码以发现或纠正数字信号在传输过程中,由于噪声干扰而造成的错码,又称为抗干扰编码,即在信息码元中按照一定规则加入监督码元(又称冗余码元)。接收端按约定的规则对收到的码元序列进行检测以发现或纠正错误,用以提高传输的可靠性。在数据通信中通常采用四种类型的冗余校验技术:垂直冗余校验(VRC)(又称奇偶校验),纵向冗余校验(LRC),循环冗余校验(CRC),以及校验和。前面三种是在物理层实现,而被数据链路层使用。校验和技术主要由网络层使用,而在传输层实现。2差错控制与流量控制在OSI模型的物理层,仅仅实现了信号的传输;而保证数据传输的可靠性,则是OSI模型的第二层,数据链路层的功能。数据链路层中最重要的功能流量控制和差错控制。2.1差错控制的方法差错控制的目的是使一个不可靠的通信链路变成一个可靠的链路。利用抗干扰编码进行差错控制可采用反馈重传纠错(ARQ)方式、前向纠错(FEC)方式和混合纠错(HEC)方式。其中,FEC方式和HEC方式是基于纠错码编码,而ARQ方式是基于检错码编码。ARQ方式就是在发送端产生能检错的校验码,在接收端通过译码判断数据是否正确,若有错,则接收端产生自动重发请求,请求发送端重新发送。该方式编码效率高,实现容易,使用最为广泛。2.2流量控制流量控制是用来告诉发送端在等待接收端的应答信号之前可传送多少数据。因为接收端在使用数据之前,必须对数据进行校验和处理,这种处理速率通常比传输速率低,因此在接收方设置缓冲区,如果缓冲区即将满,接收端必须通知发送方暂停发送。最简单的流量控制方法是停止—等待方式。即发端发送一帧数据后停下来,等待接收端的响应信号,在接收端允许发送下一帧时才继续发送,否则就等待。可见,无论是差错控制还是流量控制,它们的基础都是校验码,校验码的检错能力越强,差错控制和流量控制的效果就越好。1991年电力部颁布了《循环式远动规约》,即CDT规约,适用于点对点的远动通道结构,其主要特点是以厂站端为主动方,循环不断的向调度端发送遥信、遥测等数据。它所使用的差错控制方式是循环传送检错:发送端对信息进行抗干扰编码,发出能够检出错误的码字,即检错码;接收端收到后进行检错译码,如无错码,则进行接收处理,如有错码,则该组数码丢弃,待下次循环中在接收该信息。在CDT规约中远动信息的抗干扰编码采用的就是CRC编码。3CRC检错码原理CRC检错码是根据循环码的编译码原理进行检错的,其编码效率高,检错、纠错能力强。与基于加法的VRC及LRC技术不同,循环冗余校验CRC是基于二进制除法的。3.1CRC检错码编码原理设待传送的k位信息组M(mk-1,mk-2,…,m1,m0),所对应的信息多项式为M(x)=mk-1xk-1+mk-2xk-2+…+m1x+m0其中mi=0或1,x的幂次对应于各码元的位置。所谓编码就是已知k位信息码元,要求计算出与这k位信息位码元有关的r位监督码元,形成(n,k)(n=k+r)循环码的码字C,C就是要发送的码元序列。在编码中通常把k位信息码元放在前面,r位监督码元紧随其后,形成的码字如图1所示,这种形式称为系统格式码,有利于接收端对k位信息码元的提取。k位信息码元r位监督码元图1系统格式码(n,k)循环码系统格式码编码的步骤为⑵将信息多项式M(x)左移r=n-k位,即M(x)乘以xn-k得xn-kM(x);⑵将xn-kM(x)除以生成多项式G(x),得余式R(x)。R(x)为CRC校验码多项式,对应r位监督码元;⑶传送的码字C(x)=xn-kM(x)+R(x)。CRC检错码的检错能力与其生成多项式G(x)密切相关。(n,k)循环码的生成多项式G(x)的一般形式为:G(x)=xn-k+Gn-k-1xn-k-1+…+G1x+1;其中Gi——生成多项式的系数,为0或1。注意:G(x)的首项系数为1,末项系数也必须为1。G(x)的次数越高,其检错能力越强。可根据实际需要选择以下具有国际标准中的一个:CRC-12:g(x)=x12+x11+x3+x2+x+1;CRC-16:g(x)=x16+x15+x2+1;CRC-32:g(x)=x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1;CRC-CCITT:g(x)=x16+x12+x5+13.2CRC检错码检错原理CRC码的检错方法是:在接收端把收到的数字序列M(x)除以生成多项式G(x),得余式R(x)。若R(x)≠0,则必有错码;若R(x)=0,则认为无错码。4CRC检错码的软件实现4.1CDT规约中远动信息的帧结构帧结构如图2所示。每帧都以同步字开头,并有控制字,信息字,信息字的数量可按实际需要而定,故帧的长度是可变的。图2帧结构其中同步字为3组EB90H,即3组1110,1011,1001,0000B。控制字和信息字为都是6个字节的(48,40)码,采用循环冗余校验(如图3)。生成多项式G(x)=x8+x2+x+1。Cn-1Cn-2…Cr+1CrCr-1Cr-2…C1C0同步字控制字信息字1…信息字n4.2(48,40)CRC检错码的软件实现CRC检错码编码主要是求余式,将xn-kM(x)除以生成多项式G(x),得余式R(x)。在这里采用8位求余算法:将40为信息位分为5段(m4,m3,m2,m1,m0),每段8位,每8位求一次余式。我们已知一个字节的8位可以有28=256种信息组合。可先把这256种信息所对应的余式计算好,存在内存中,形成余数表。计算一个字节的余式:unsignedcharCode(intc){inti;c=(unsignedchar)c;for(i=0;i8;i++){if((c&0x80)!=0){c=c1;//左移1位;c=c^0x07;//异或运算;}elsec=c1;}return(c);//余数保存在c中。}//因为G(x)是9位,所以在上面函数中被分为ox80和0x07来运算。//模2除的实质就是进行异或运算。通过左移8次来表示将c后加了8个0。因为循环码的抗失步能力弱,所以要在循环码的码字上加一个固定的数字序列,形成陪集码T(x)=C(x)+P(x)。适当选择P(x),可使陪集码具有一定的检查失步和恢复同步能力。对于(48,40)码:P(x)=x7+x6+x5+x4+x3+x2+x+1即把所有的监督位取反。因此,对于m=5544332211(H),所得的循环码码字C=55443322117b(H),陪集码T=554433221184(H)。发送端发送的是陪集码。以上CRC编码的结构良好,执行效率很高,且具有良好的可移植性。5结束语校验多项式为G(X)=X8+X2+X+1,对每个控制字或信息字的前5个字节进行CRC校验,生成一个8位的余数,该余数取反后即作为校验码尾随前5个字节发送。计算方法如下:将每个字节的控制字或信息字中的前5个字节按从低到高的顺序排列,每个字节的位从高到低排列,构成一个位流,在这个位流的后面加上8个0,从而得到一个48位的位流。用校验多项式107H(X8+X2+X+1)作为除数去除这个码流,相除时不做减法而做异或,得到一个8位的余数,将这个余数取反后或到48位的码流尾部,既可得到一个带8为的CRC校验码的48位序列。例:有信息字包括下面5个字节43H,E8H,7DH,33H,56H,可得到一个码流01000011,11101000,01111101,00110011,01010110,00000000,用107H除该码流,得到余数2FH,取反得到校验码D0H,最后发送的字节为:43H,E8H,7DH,33H,56H,DOH共6个字节。FunctionCalcCRC(S:String):Char;Varq,r,Crc:word;B:byte;BeginCrc:=Byte(S[1]);//把Crc看做多于8位的数据,下面的程序才正确。B:=Byte(S[2]);r:=0;//记录左移次数。每个字节移8次;q:=1;//记录处理的字节的个数(48,40),最大为五个字节Crc:=Crcshl1;//左移一位whileq6do//五个字节没处理完则循环beginif((Band($80shrr))0)thenCrc:=Crcor1;//考虑B是否需要进位。因为B是Crc的下一个字节,//所以Crc左移一位,B就应该左移一位,//并且把移出去的最高位放到Crc移位后的最低位。ifCrc=$100thenCrc:=Crcxor$107;//检查Crc的最高位是否为1,若不是1,则没必要进行异或运算。//因为G(x)的最高位是1Crc:=Crcshl1;inc(r);ifr=8then//处理完一个字节后就处理接下来的字节。beginr:=0;inc(q);B:=Byte(S[q+1]);end;end;//五个数据已处理完,Crc中此时存放的就是五个数据组成的字节流的余数,//不过它是九位的B:=Crcshr1;//形成8位余数B:=notB;//余数取反得校验码。result:=chr(B);end;