在通信系统中,为了保证数据传输的完整性和正确性,通常都会加入数据校验手段进行数据的验证,一般是发送端在数据包的尾部,按照一定的校验算法计算之后得到一个或几个字节的校验码,一起传输到接收端,接收端收到完整的包之后也采用同样的算法对接收到的数据进行校验。然后将校验的结果与发送端发送的校验结果进行核对,如果一致,则任务是有效的正确数据,如果不一致,会认为数据错误,会丢掉接收的数据不做处理,如在数据在总线上收到干扰等因素,导致部分数据错误,就可以通过这样方式检验出来。
常用的校验方式有奇偶校验、累加和校验、与CRC循环冗余校验等。 奇偶校验有两种,奇校验和偶校验,奇偶校验是校验方式中最简单的一种,是根据数据流的二进制代码的数位中“1”的个数是奇数或偶数来进行校验的,奇偶校验一般有一个专门的奇偶校验位,要么是0,要么是1。奇校验是让原始码流加上校验位总共有奇数个1,偶校验是让原始码流加校验位总共有偶数个1,需要注意,奇校验是产生不了全0代码的。
比奇偶校验复杂一些的是累加和校验,也叫CheckSum。最常见的是8位校验和和16位校验和,累加和校验顾名思义就是对数据进行累加,最后得到一个数据和,然后对数据和求反,就是得到了校验值,发送端和接收端都是通过这种算法进行的数据和计算,然后根据两边的数据和进行比较来判断数据的准确性。8位和16位两种方式就是采用的校验和的数据长度。校验和计算是一种比较有效的校验发是,也被很多标准协议所采用。 最后就是更加复杂一点的循环冗余校验,也就是CRC校验,常用的CRC计算方法有CRC8,CRC16,CRC32,也就是checksum的长度占位是8位,16位,32位,CRC的校验原理是采用模2除法进行计算。一般在设计时,因为实际的计算时间比较长,往往会采用通用函数进行查表法的方式进行CRC校验值的提取。CRC校验可以高比例检查出数据传输过程中的错误,在通信系统中应用非常广泛,比方说MODBUS协议采用的就是CRC的校验方式,在对于抗干扰要求很高的汽车总线CAN通信中,CRC也得到了使用。
除了以上介绍的3种最常见的校验方法,还有MD5校验和数字签名及BCC异或校验法,MD5比较适用于大量的数据及文件的校验,比如说重要资料的检验,下载文件的检验,密码的加密等,BCC异或校验法是将每一个字节的数据进行异或后即得到校验码的方式。常常越是复杂的校验,对于错误的检出能力越强,需要根据自己的总线易干扰程度和数据的重要性来选择最合适的校验方式,这样即可以有效的保证数据的准确又可以减小程序在数据校验处理上的运行开支。
|