王 华, 刘 冰, 刘焕敏, 段慧芬, 马东艳
一种双网实时串口通信的设计与实现①
王 华, 刘 冰, 刘焕敏, 段慧芬, 马东艳
(中国卫星海上测控部, 江阴 214431)
设计了一种跨网传输的串口通信软件, 该软件采用数据收发双线程机制和数据队列线程间数据共享机制, 设计了数据通信的数据帧类型校验、数据帧CRC校验和数据帧帧长校验等方法, 保证数据高效性、安全性和完整性, 通过速率测试和误码测试, 证明该模型实现了可靠、安全和高效的串口通信, 满足了在试验网和信息网之间实时数据通信的需要.
串口通信; 帧长校验; 实时数据通信; CRC校验
在飞行器测控领域随着信息化的发展和应用, 逐渐开发和组建了不同的专用业务的内部局域网络, 由于各个局域网的业务流不同, 为了保证其安全性, 在各局域网上进行物理隔离, 但随着信息发展与共享的需求, 各局域网之间有一定速率数据通信的需求. 因此, 在保证安全性的情况下, 研究了双网串口通信的方法.
所谓“串行通信”是指数据在一根数据信号线上一位一位地进行传输, 每一位数据都占据一个固定的时间长度. 这种通信方式使用的数据线少, 在远距离通信中可以节约通信成本, 当然, 其传输速度比并行传输慢. 典型地, 串口通信传输ASCII码字符的[1]. 使用3根线完成: (1)地线, (2)发送, (3)接收. 由于串口通信是异步的, 端口能够在一根线上发送数据同时在另一根线上接收数据. 其他线用于握手, 但是不是必须的[2]. 文章中的每个串口通信“包”是指一个字节, 其顺序为开始位、数据位、奇偶校验位和停止位. 常用的串行通讯协议有RS232、RS485及RS422等等.
在两个串行端口通信中参数必须匹配一致, 包括波特率、数据位、停止位和奇偶校验.
a. 波特率, 表示每秒钟传送的bit的个数, 与距离成反比, 表示通信速度的参数.
b. 数据位, 标准的值是5、7和8位, 是通信中实际数据位的参数. 其设置使用在于传输的信息; 比如, 标准的ASCII码是0~127(7位). 扩展的ASCII码是0~255(8位).
c. 停止位, 表示单个包的最后一位. 典型的值为1、1.5和2位. 停止位不仅表示传输结束, 并且提供计算机校正时钟同步的机会. 停止位数越多, 数据传输率越慢, 但不同时钟同步的容忍度越大.
d. 奇偶校验位, 是默认的检错方式. 包括: 偶、奇、高、低和无校验位. 对于偶和奇校验的情况, 串口会设置校验位, 确保传输的数据有偶数个或者奇数个逻辑高位. 发送数据时, 如果数据是011, 那么对于偶校验, 校验位为0, 保证逻辑高的位数是偶数个. 接收数据时, 对“1”的个数进行校验, 若发现不一致, 则说明传输过程中出现了差错.
两台微机点对点常用的串口通信过程, 如图1所示.
a. 串口初始化, 设置一致的通信参数;
b. 打开串行通信端口;
c. 串行端口通信, 一端发送数据或者一端接收数据;
d. 通信结束后, 关闭端口, 释放占用资源.
图1 串口通信过程
在不同的编程环境下, 均提供了串口通信控件和函数, 在C#中, 提供了SerialPort控件实现串口通信, 该控件可直接对串口的各类参数初始化; 提供了backgroundWorker控件, 创建独立的线程[3].
2.1双网串口通信需求分析
在飞行器测控领域中, 在试验网中数据有一定的敏感性, 需将部分非敏感实时数据传输到信息网, 其首要需将非敏感数据分离, 并重点保证试验网的安全性, 因此有以下需求:
将试验网中的部分试验数据单向传输到信息网中;
保证数据传输的可靠性;
保证数据传输的实时性, 其传输速率满足需求;
保证数据传输的安全性.
2.2应用设计
根据以上需求, 双网采用串口单向通信的方式进行数据传输, 其设计的软件包括两部分, 一是数据转发软件, 运行在试验网; 一是数据接收软件, 运行在信息网. 具体设计如图2所示.
图2 系统间信息接口
2.2.1双网通信硬件构成
a. 数据转发微机(运行数据转发软件)+ RS232串口通信卡.
b. 数据接收微机(运行数据接收软件)+ RS232串口通信卡.
c. 2个RS232串口通信卡之间通过1.25米RS-232连接线点对点连接.
在图2中, 试验网中的试验数据通过广域网发送到本地的远程实时通信软件, 由其进行统一的数据收发后; 将接收的原码数据包UDP组播发送给使用者, 数据转发软件接收该UDP组播的数据包并从串口转发出去. 数据接收软件从串口接收数据并进行UDP组播; 这样从试验网传输过来的数据通过数据处理和存储, 实现在信息网中进行二次利用.
在需求中要求数据从试验网向信息网发送数据, 为保证试验网的安全性, 在数据串口通信软件设计中采用单工的通信模式, 控制数据流向.
在需求中要求数据传输的实时性和可靠性, 根据数据传输需求, 计算所传输的各类数据流量最大不超过25kbit/s, RS-232接口通信板传输速率为最大支持115.2kbps(传输距离小于15m), 因此采用专用的RS-232接口串口通信板, 其可靠性高、性能稳定, 理论上满足数据实时性速率需求[4].
2.2.2软件设计
为了满足需求, 保证数据传输的可靠性、安全性及低误码率, 因此串口通信的软件设计也尤为重要, 因此数据转发软件和数据接收软件的设计如图3所示.
图3 优化的串口通信软件设计
在串口通信中, 容易出现数据丢帧、传输速率低、误码率高及数据传输发送端和接收端数据帧长不一致等问题, 因此, 在数据转发和数据接收软件的中, 均采用了双线程设计, 一个接收线程, 一个发送线程, 数据收发功能明确; 在数据转发软件的UDP数据接收线程中增加了数据帧类型校验功能, 该功能起到非敏感数据转发控制的作用, 通过数据帧类型判断, 属于允许转发的数据, 才送入队列通过串口发送出去, 否则不符合条件, 该数据丢弃. 另外对转发的数据设计了数据帧CRC校验和数据帧帧长校验等功能, 采用数据队列的方法存储和共享数据, 实现线程间数据同步, 保证数据的安全性, 防止数据丢失.
串口通信程序采用C#.NET开发平台, 使用SerialPort控件实现, 在编写串口通信的过程中将遇到的问题及解决方法, 一一进行阐述[5].
3.1串口通信帧信息校验
对通信的可靠性检查就需要‘校验’, 校验是对数据本身的检查, 奇偶校验码作为一种检错码虽然简单, 但是漏检率高. 在数据通信中用的最广泛的检验差错方法, 是一种漏检率低得多也便于实现的循环冗余码CRC(Cyclical Redundancy Check), 它是利用除法及余数的原理进行错误侦测(Error Detecting). 实际应用时, 该方法在发送端用数学方法计算生成一个CRC校验码, 在信息码位之后随信息一起发出. 在接收端也用同样方法计算生成一个CRC校验码. 将这两个校验码进行比较, 如果一致就证明所传信息正确; 否则数据传输有错误. CRC码是由两部分组成, 前部分是信息码, 就是需要校验的信息, 后部分是校验码, 如果CRC码共长个bit, 信息码长个bit. 它的编码规则是[6]:
① 首先将原信息码(bit)左移位(+=);
② 运用一个生成多项式()(也可看成二进制数)用模2除上面的式子, 得到的余数就是校验码. 模2除就是在除的过程中用模2加, 模2加实际上就是我们熟悉的异或运算, 就是加法不考虑进位, 公式是: 0+0=1+1=0,1+0=0+1=1即‘异’则真, ‘非异’则假. 具体算法如下.
3.2串口通信帧长校验
在串口通信过程中, 由于试验信息是按照约定的数据帧形式进行一帧一帧的发送, 数据的帧长随着数据类型的不同而变化的, 在串口数据收发的过程中, 经常出现发送端数据帧长和接收端数据帧长不一致的情况, 导致数据的误码率直线上升; 在经过测试与分析后发现, 是由于串口异步通信的机制, 数据按位传输, 发送端一次性发出的数据, 接收端接收线程检测到有数据, 触发串口接收, 但接收的数据长度不定无法控制, 就导致一帧数据可能出现分批接收的情况, 或者出现多帧数据一次性接收的情况.
为了解决这个问题, 于是设计在数据帧发送前添加了数据帧长校验, 对CRC校验后的数据进行二次封装, 添加帧长校验信息, 其帧长校验信息格式如图4所示. 这样通过帧长校验信息, 在接收端进行帧长校验, 将分批接收的数据或者一次性接收的多帧数据进行解析提取和恢复.
图4 帧长校验格式
图4中, 将帧头设计为2个字节, 帧头内容可以设置为任意与数据域内容不冲突的字符或数据, 在双网串口通信中, 采用了不使用的特殊字符'$'作为帧头标识. 帧长为校验后的数据字段与CRC校验码长度之和, 根据实际应用情况将帧长字段设置为2字节, 数据类型为Int16. 这样通过设计的帧长校验格式, 在接收端进行帧长校验.
如图5所示, 接收端帧长校验步骤:
① 在串口接收线程中, 串口等待接收数据, 判断如果接收端口收到数据字节数大于4字节, 则开始接收数据, 并将其存储于待解析数据队列, 进入步骤2; 否则继续等待;
② 将待解析数据队列中的数据进行数据帧解析和提取. 首先判断帧头标识是否为‘$’, 如果不一致, 表示该帧数据帧头缺失, 数据丢弃; 否则到步骤3;
③ 取首帧帧长字段值, 判断是否与队列数据长度是否一致; 如果一致, 表示队列中只有1帧数据, 可将该帧数据直接解析出来, 并从待解析数据队列删除; 如果大于队列数据长度, 表示待解析队列中, 1帧数据未接收完整, 转入步骤1; 如果小于队列数据长度, 表示待解析队列中包含多帧数据, 则转入步骤4;
④ 通过帧头‘$’和帧长字段值, 循环解析提取单帧数据, 按照步骤3直至数据解析完毕; 跳转至步骤1, 串口继续等待数据接收.
图5 数据帧长校验流程
3.3双网串口通信性能测试
在文章设计的双网数据通信中, 数据转发软件中设计了UDP数据接收线程和串口发送线程, 在初始代码实现后, 进行串口通信速率测试过程中发现当发送数据按照200帧/s, 帧长为60字节, 总流量约93.8kbit/s, UDP接收及串口收发两端均正常, 并且串口收发无延时. 当按照300帧/s, 帧长为60字节, 总流量约140.7kbit/s, UDP接收端开始出现数据丢帧的情况, 串口数据收发和UDP端相比, 出现明显的数据时延. 经测试分析, 接收UDP组播数据时, 创建UDP端口时, UDP端口接收数据量受限于接收缓冲区的大小, 因此在UDP端口初始化时, 需要设置接收缓冲区的大小. C#中代码如下.
这样优化后, 通过不同速率测试, 极限情况下按照2000帧/s, 帧长均为40字节, 总流量<625kbit/s的情况发送数据, 数据收发均正常, 消除了UDP端口数据接收丢帧的情况; 由于串口通信速率远低于该速率, 与UPD接收数据速率相比有明显时延, 并随着时间数据差距逐渐增加, 通过使用队列存储数据, 消除了接收与发送之间速率差造成的丢帧情况.
误码率是最常用的数据通信传输质量指标, 用来衡量数据在规定时间内数据传输精确性, 表示在一定时间内收到的数字信号中发生差错的比特数与同一时间所收到的数字信号的总比特数之比, 也称为“误比特率”. 在双网串口通信中, 通过数据帧类型校验、数据帧CRC校验和数据帧帧长校验, 增强了串口数据通信可靠性、完整性及安全性. 试验网误码率要求为低于10E-6, 按照此要求进行了测试, 详见表1, 测试结果符合要求.
计算方法: 误码率=接收出现差错的比特数/总的发送的比特数.
表1 误码测试结果
本文设计的双网串口通信软件, 通过数据收发双线程机制和数据队列线程间数据共享机制的应用, 有效提高了数据通信的高效性, 通过数据通信的数据帧类型校验、数据帧CRC校验和数据帧帧长校验等方法, 有效保证数据通信的可靠性和完整性, 经速率测试和误码测试, 证明该设计模式实现的跨网串口数据通信可靠、安全和高效, 满足了今后在试验网和信息网之间实时数据通信的需要.
1 李江全,聂晶,梁习卉子,等.单片机串口通信及测控应用实战详解.北京:人民邮电出版社,2014.
2 李江全.Visual C#.NET串口通信及测控应用典型实例.北京:电子工业出版社,2012.
3 郑阿奇.Visual C#网络编程.北京:电子工业出版社,2011.
4 王小科,王军.C#开发实战1200例.北京:清华大学出版社, 2011.
5 王小科,赵会东.C#程序开发范例宝典.北京:人民邮电出版社,2012.
6 吕晓敏.嵌套循环冗余码(CRC)的优化与检验[硕士学位论文].杭州:浙江大学,2012.
Design and Implementation of Real-Time Serial Communication on Networks
WANG Hua, LIU Bing, LIU Huan-Ming, DUAN Hui-Fen, MA Dong-Yan
(China Satellite Maritime Tracking and Control Department, Jiangyin 214431, China)
This paper presents the design of a serial communication software cross network transmission, the software uses the data transceiver double thread mechanism and data queue data sharing mechanism between the threads, in order to ensure the data security efficiency and integrity, those methods are designed on the data communication, such as data frame type check, data frame CRC check and data frame length check. Through the test, the rate and bit error test, it proves that this model to realize serial communication is reliable, safe and efficient, to meet the future real-time data communication between the mission network and the information networks needs to be.
serial communication; data frame length check; real-time data communication; CRC check
2016-06-13;
2016-07-25
[10.15888/j.cnki.csa.005642]