0 引言
对于基于flash控制器的8051的芯片结构,一般在进行数据传输时,都是先通过串口将数据传送到flash控制器的buffer中。由于buffer的大小为512 bytes,所以每次传输的最大数据量为512bytes。本文中所讨论的三种检错方法的传输数据量均为512 bytes。
1 检错方式
基于8051的串口数据通信系统的硬件开发平台框图如图1所示。利用该平台进行数据传输时,通常有三种数据检错方式。
1.1 奇偶校验
奇偶校验是检错中比较常见的一种方法。它利用数据中的1的个数作为检错的标志位,若1的个数为奇数个,则错误检测的标志位为1,若1的个数为偶数,则错误检测的标志位为0。在发送端和接收端同时检测奇偶位,若得到相同的结果,则说明数据传输过程无错误发生;若得到不同的结果,则说明数据传输过程中有错误发生,此时8051会发送一个错误重传的信号,让PC端再次发送数据。
1.2 循环冗余校验(CRC)
CRC是利用除法和余数的原理来进行错误检测(Error Detecting)。如果原始数据为多项式JP(x),则将P(x)对生成的多项式G(x)进行模2除法,再将得到的余式R(x)作为生成的CRC校验码,用公式可以表示为:
P(x)=Q(x)·G(x)+R(x)
上式中的Q(x)为除法得到的商。发送端将原始数据P(x)和生成的CRC校验码R(x)发送到接收端。接收端则根据接收到的数据P'(x)算出另外的一个CRC校验码R'(x),然后对两个CRC校验码进行比较,即可得出在传输过程中是否有错误发生。若发生错误,则用发送端重传。本文中所采用的CRC8所生成的多项式G(x)为:x2+x5+x4+1。
1.3 汉明码(Hamming)
汉明码是在一组代码中加入一定数量的冗余,以形成一组新的数据。新加入的冗余数据被称为校验位。若某个信息位出错,则将引起几组奇偶校验结果均出错,由此根据奇偶组的检错,便可确定误码的信息位及性质。汉明码具有如下特点:
码长:N=2m-1
信息码位:k=2m-m-1
监督码位:r=N-k=m,其中m≥2正整数
由于本文中的检错对象是串口发送,一次发送8 bits数据,故需要的冗余位为4 bits,本文采用的汉明码为(12,8),其编码由8 bits数据和4bits组成。设数据分别为a0,a1,a2,a3,a4,a5,a6,a7。检验位为a8,a9,a10,a11,它们可按下面的式子决定:
2 测试环境及原理
本文的测试平台分为两部分,即PC串口发送部分和8051串口接收部分。PC通过串口发送数据,每次串口发送的单位为8 bits。8051通过串口接收PC发送的数据。由于硬件的限制,8051中存储数据的buffer最大为512 bytes。所以PC端的数据每次也只发送512 bytes,总共测试的数据大小为8 K bytes,传输完8 K bytes的数据需要16次。串口传输的波特率为57600。8051接收来自PC的数据,每次接收512 bytes数据,并进行错误检测。若检测到错误,则给PC发送一个重传请求,若没有检测到错误,则给PC发送一个继续传输的命令。
为了提高传输效率,在不影响检错的情况下,可分别对奇偶校验、CRC校验、汉明码校验采用不同的数据传输结构。
奇偶校验每发送8 bits数据就算出1 bit的奇偶位,在算出8 bits的奇偶位之后,再将校验位一起发送到8051,其中数据D为512 bytes,Group为64bytes,data为8 bits数据。其数据结构如图2所示。
CRC校验时,每512 bytes数据产生1bytes校验位并发送到8051,其数据结构如图3所示。其中D为512 bytes,data为512 bytes,CRC byte为8bit。即每512个bytes得到一个CRC校验值。汉明码由于采用了(12,4),每8 bits数据产生4 bits的校验位。故其数据结构如图4所示,图中,D为512 bytes的数据,data为8 bits的数据。
3 测试结果分析
本文通过相同的环境,综合比较了三种错误检测的实际效率,其实验结果如表1所列。
表1是根据发送数据的长短和波特率计算出来的理论值,实际测试值则是调用PC端的时间函数来测试的。为了提高汉明码的解码效率,本文在8051上通过汇编语言进行解码。通过对得出的表中数据进行分析可见,CRC校验具有最好的检错效率,且差错率低,耗时适中。
4 结束语
本文通过对串口传输中三种检错方法的大量数据进行比较,分析了它们的检错结果和效率。在奇偶校验中,为了提高检错速度,8051端可采用汇编语言直接读取标志位寄存器中的奇偶标识。而在汉明码中,则可分别采用C语言和汇编语言来进行编程。三种检错方法中,耗时最低的是奇偶校验,其检错的速度最快,CRC8次之,检错最慢的是汉明码。误差率最低的为CRC8,其次为汉明码,奇偶校验发生错误的概率比较大。
由于是串口通信,出错的概率比较小,因此,传输较大文件时,检错一般采用奇偶校验,只有对误差率要求较高的场合,才用到CRC。汉明码一般很少用于检错场合。