我也聊聊串口通信协议:数据包校验与常用校验算法
本篇博客主要记载了我对数据校验过程以及奇偶校验的理解。
1.数据校验过程
由于数据传输距离的因素影响,计算机和受控设备间的通信数据就常常出现不可预知的错误。为了防止这些错误所带来的影响,一般在通信时采取数据校验方法,而奇偶校验和循环冗余码校验就是其中最常用的校验算法。串行数据在传输过程中,由于干扰可能引起信息的错误,出现“误码”。我们把如何发现传输中的错误,叫“检码”;发现错误后,如何进行修订,叫“检错”。之前,就有过提示,为了保证数据在传输过程中不会出错,每个数据包后面一般都会加上校验字节。
校验过程是发送端(TX端)和接收端(RX端)共同完成的过程。如上图所示,首先,TX端按照用户层协议(数据包格式)将数据根据校验算法计算出TX校验字节,并将TX校验字节按照协议放在数据包的指定位置。RX端接收到数据包后,在指定位置取出TX校验字节,同时,再将接收到的数据按规定方式计算出RX校验字节,如果RX校验字节与接收到的TX校验字节相等,则说明数据包是有效的,否则就应该放弃该数据包。
2.简单粗暴地奇偶校验
最简单粗暴的方法就是“奇偶校验”了,即在传输字符的各位之外,再传送一位奇/偶校验位。可采用的策略分为奇校验和偶校验。2.1 奇校验
所有传送的位数(含字符的个数位和校验位)中,“1”的个数为奇数,如1 0110,0101;0 0110,00012.2 偶校验
所有传送的位数(含字符的各位数和检验位)中,“1”的个数为偶数,如1 0100,0101;0 0100,0001奇偶校验能够检测出信息传输过程中的部分错误的数据(一位错误的代码能够检出,两位及以上的错误代码不能检出)。奇偶检验有一个劣势,就是他只能发现错误,而不能纠正错误;一旦发现错误,那么没办法,只能重发。但是由于奇偶校验使用起来非常简单,仍然被广泛使用。但是仍存在一些良好的矫正错误数据的方法,并具有自动訆错能力,如循环冗余码(CRC)检错等。
3.异或校验
异或校验方法也是非常简单,而且非常通用,虽然使用该方法校验后仍存在出错的可能,但是因为异或算法非常简单,编程毫不费力,一般新手都用这种方法。之前介绍过的NMEA-0183无线通信协议是在异或算法基础之上进行了一定的改进。能够理解异或运算,并使用好异或校验算法,会使得数据处理编程变得轻松容易。
4.CRC循环冗余码校验
循环冗余码校验(Cyclical Redundancy Check, CRC)是利用除法和余数的原理来做错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置RX,RX对收到的数据重新计算CR并与收到的CRC值相比较,若两个CRC值不同,则说明数据通信出现了错误,该数据包应该舍弃不用。在远距离数据通讯中,为确保高效而无差错的传送数据,必须对数据进行校验控制,而CRC是对一个传送数据块进行校验,是一种非常高效的差错控制方法。目前,主流的CRC可以分为以下几个标准:CRC-12码;CRC-16码;CRC-CCITT码;CRC-32码。CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码用途有限。在数据存储和数据通信领域,CRC无处不在:著名的通信协议X.25的FCS(帧检错序列)采用的是CRC/CCITT,ARJ/LHA等压缩工具软件采用的是CRC32,磁盘驱动器读写采用的日式CRC16,通常用到的图像存储格式GIF/TIFF等也是采用CRC作为检错手段的。4.1 CRC-16的生成过程
CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高位向低位进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移除CRC寄存器)如果是1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,就无需进行进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个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值。4.2 如何理解CRC码?
CRC校验是一种多项式除法:将需要发送的数据包当做一个很大的二进制数,用它来除以一个固定的二进制数,所得到的余数即是所求得的CRC校验码。
我也聊聊串口通信协议:数据包校验与常用校验算法相关推荐
- 我也聊聊串口通信协议:用户层通信协议的编制
1.闲话闲聊 最重要的写在前面:用户层通信协议就是数据包格式!!! 没有进行串口通讯实践的朋友可能会想:为什么要编制用户通信协议呢?通信过程中为什么要进行数据处理呢?在设计中编过串口通信程序的读者应该 ...
- arduino串口接收数据包_Arduino 串口接收转发十六进制数据,软串口收不到数据
我是Arduino初学者,今日尝试用Arduino nano 收串口发来16进制数据,再由软串口转发给下级设备,下级设备返回16进制数据.首先简单测试代码如下: #include SoftwareSe ...
- TCP聊天室02 通信协议数据包的设计
//Msg.h #pragma once #include <windows.h>#pragma comment(lib,"Ws2_32.lib") //******* ...
- 一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...
[题目描述] 6046 数据包的调度机制 By OIer14wa随着 Internet的迅猛发展,多媒体技术和电子商务应用日益广泛,Internet上的服务质量 (QoS,Qualityof Serv ...
- 大数据建模步骤 以及常用的算法
1.数据建模的基本流程是什么?只需要做好六步 2.基本概念-回归.分类.聚类_测试狗一枚的博客-CSDN博客_分类 回归 聚类
- NS2中数据包Packet的分析 (转帖)
1. NS2中数据包packet类结构图: packet类中的access函数如下: inline unsigned char* access(int off) const { if (of ...
- 30、IP数据包结构
本节来学习IP数据包的结构,前面我们一直在说数据包,IP数据包是网络层的PDU.PDU的概念我们在本专栏第2节的内容中谈到过,忘记了就赶快去复习.数据包也被称为"IP数据报"或者& ...
- 重生之我是赏金猎人(二)-逆向app破解数据包sign值实现任意数据重放添加
0x00 项目背景 该系列旨在分享自己和团队在SRC.项目实战漏洞测试过程中的有趣案例,如果读者能从本项目习得一些有用的知识,那么笔者将非常荣幸. 该系列首发github:https://github ...
- 重生之我是赏金猎人-SRC漏洞挖掘(二)-逆向app破解数据包sign值实现任意数据重放添加
0x00前言 本期登场的目标虽不是SRC,但是整个漏洞的利用手法很有学习意义.目前在很多大厂的http数据包中都会添加sign值对数据包是否被篡改进行校验,而sign算法的破解往往是我们漏洞测试的关键 ...
最新文章
- Access中复制表
- “===” 也有不靠谱的时候
- 纯真IP地址数据库qqwry.dat解析
- 【数理知识】《积分变换与场论》王振老师-第3章-矢量与矢量空间
- Spring Boot 入门(五):集成 AOP 进行日志管理
- python pprint_如何美观地打印 Python 对象?这个标准库可以简单实现
- 虚拟实验工场大学计算机实验报告答案,虚拟实验实验报告 - 实验报告 - 书业网.doc...
- 【转】10.Qt编程涉及的术语和名词
- linux内核丢包分析工具,Linux模拟网络丢包与延迟的方法
- JS 实现两表格里的数据来回 转移
- 编译fastdfs报错Makefile:59: recipe for target 'fdfs_monitor' failed
- 隐藏窗体关闭按钮_VB编程(五)按钮和窗体
- java day43【Filter:过滤器 、Listener:监听器】
- 福建师范网络教育应用计算机,福建师范大学网络教育计算机应用基础课程期末考核答案.docx...
- 细丝菲涅尔衍射MATLAB,任意孔型菲涅尔衍射matlab仿真.docx
- mysql用户主机设置密码_MySQL用户账号管理(添加、删除、限制、设置密码、远程访问)...
- STM8在STVD下开发所需的中断向量表模版
- 天云大数据_【案例分享】天云大数据最佳实践系列之——信用评分模型
- 华为MateBook E 12.6英寸 win11 16g+512g 轻评测
- 上传artifacts到maven仓库