串口数据解包方法的研究
2020-04-11夏志飞赵雷凌云科技集团有限责任公司
■ 夏志飞 赵雷/凌云科技集团有限责任公司
串口通信常用于计算机及嵌入式设备的数据通信,尤其是在远程控制、测试测量等工业应用中,数据经常以数据包的形式传输,发送数据时需封包,接收数据时需解包,准确无误地解包是一项非常重要的工作。
1 串口通信
目前常见的串口通信接口标准有RS-232、RS-422、RS-485等, 其 中,RS-232是美国电子工业协会(EIA)在20世纪60年代发布的通信协议,方便不同厂家产品之间数据的通信;RS-422在RS-232的基础上提高了传输距离和抗干扰能力;RS-485又在RS-422的基础上增加了多点双向通信能力[1]。这几种标准只规定了通信接口的物理层电气标准,在此基础上,用户可以建立自己的高层通信协议。
对于工程应用而言,信息传输的稳定性以及正确性非常重要,如果每次传输的数据超过一帧,一般就采用数据包的形式传输。如图1所示,每个数据帧由多个连续的位(Bite)构成,通常包括起始位、数据位、校验位和停止位,数据位长度一般为5~9,每个数据包又由多个连续的数据帧构成。串口通信的速率相对较低,一般数据量有限,采用单数据包机制,少数也有采用类似网络通信分层处理方式的,但中间层一般还是采用数据包机制。
2 数据包格式分析
为了避免数据传输中的混乱与错误,便于数据的解释与分析,数据包之间必须有明显的标志,通常基于以下两种方式。
1)基于特殊字符
以特殊字符作为数据包的开始,再根据帧尾或帧长确定整个数据包,具体的格式很多,如包头+数据+校验+包尾、包头+数据长度+数据+校验值等,优点是特殊字符识别容易、逻辑简单,缺点是数据域中不能包含包头、包尾,当然可通过增加转义符的方式来避免,只是要增加额外的处理。
图1 数据包结构
2)基于时间
数据包内数据连续传输,数据包间存在一定的间隔时间。优点是比较通用,绝大部分串口通信都不是满负荷传输,数据包间都存在较大的时间间隙;缺点是处理稍复杂,需要判定时间。
当然,以上两种方法经常结合在一起使用,可以减少数据传输中出现的异常,共同保证了数据传输的可靠。
3 实用解包方法
串口数据包的解包过程通常分为数据包分割、数据提取与分析两部分,在不清楚串口通信协议的情况下,还需反推数据帧和数据包的格式。
1)数据帧格式反推
在缺少资料的情况下,可直接基于串口通信物理接口进行分析,采用示波器分析可知串口通信的类型。RS-232一般采用三线制传输数据,少数采用五线制传输数据,标准RS-232信号电平为±12V;单片机之间的通信有时也采用TTL电平标准。RS-422/RS-485采用四线或双线差分传输,差分电压一般为±5V。
确定串口通信标准后,还需确定数据帧的格式。采用逻辑分析仪进行分析较为方便,部分逻辑分析仪如Saleae Logic等包含了串行总线数据分析功能(见图2)[2],设定串口数据帧的波特率、数据位长度、停止位、校验位等参数后再分析采样数据,尝试几次便可确定数据帧的格式。
2)数据包分割
绝大部分数据包之间都存在一定的时间间隙,可据此判定分割。数据量较多时,一般需借助计算机程序自动分割,下面介绍一种数据包分割识别的方案。
图3为数据包分割的基本流程,无论是计算机还是单片机都可使用。对于计算机而言,Windows操作系统下定时器精度一般只达到1ms,无数据时长(数据包间隔)一般要求大于10ms;对于单片机而言,由于不少型号的单片机没有串口硬件缓存,定时查询的时间需小于单个数据帧传输的时间。
依据数据包间隔超时分割数据包时,还可同时依据数据包头、数据包尾、校验等进行判定及筛选,图4是基于此原理开发的UART splitter软件数据包分割的设置界面。
3)数据包格式反推
反推数据包格式时,首先确定数据包的构成。一般数据的包头、包尾、包长度的位置是固定的,较容易识别;校验通常有和校验、CRC校验等几种,需要猜测几次才能确定;余下的一般就是数据区。
图2 Saleae Logic逻辑分析仪串口总线分析设置界面
图3 数据包分割的基本流程
图4 UART splitter软件数据包分割设置界面
确定数据包的构成后,需要重点分析的便是数据区。常见的数据编码有BNR(按2的补码小数记法表示的二进制)码、BCD码或ASCII码等,少数采用自定义编码,或由多个数据组合成一个数据包,甚至涉及加密,这样的数据需要大量采样后统计、分析其规律。
4)数据提取与分析
数据包中的数据通常不能直接处理,其处理方式需根据工程的需求而定,一般需将有效数据提取出来并进行一定的转换处理后再进行分析。若数据量很大或计算复杂时,Windows操作系统下一般需另开线程处理,单片机中一般需在低级别的中断中处理,以确保数据包分割的实时性。
4 结束语
本文主要介绍了串口数据解包的基本原理和方法,该方法已应于笔者参与的多个工程中,取得了较好的效果,此外,该方法对 SPI、I2C、CSDB、Manchester等串行总线数据的解包也有借鉴意义。