葛勇 姚金华 王军
摘要:串口设备是嵌入式系统经常用到的设备之一,其本身具有很高的数据传送精度,但是如果使用方法不当,也会造成数据接收的误码率显著增大。本文以某控制系统为例说明正确的使用方法可以显著提高串口接收的可靠性。
关键词:串口;嵌入式;误码率
中图分类号:TP368.11 文献标识码:A 文章编号:1007-9416(2018)07-0115-02
1 概述
随着计算机系统的应用和微机网络的发展,通信功能越来越显得重要。通信既包括计算机与外部设备之间的信息交换,也包括计算机和计算机之间的信息交换。由于串行通信是在一根传输线上一位一位的传送信息,所用的传输线少,并且可以借助现成的电话网进行信息传送,因此,特别适合于远距离传输。对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘等,采用串行方式交换数据也很普遍。在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,各CPU之间的通信一般都是串行方式,所以串行接口是微机应用系统常用的接口[1-3]。
2 控制系统简介
某控制系统共有三个组合组成:管理机柜组合、控制机柜组合和控制单元组合组成。管理机柜组合通过网络与上级系统进行信息交换,通过上级系统的命令来形成相应的内部命令。管理机柜通过串口将内部命令发送给控制机柜组合形成相应的硬件命令。控制机柜软件通过DI/O与控制单元完成命名交换并通过串口与被控制体进行数据交换以获取被控制体的当前状态和向被控制体发送命令。在综合判断被控制体和控制单元返回的状态后,控制机柜通过串口将状态返回给管理机柜。
3 串口通信的问题
从系统工作流程可以看出,串口通讯在控制系统的工作过程中起到了非常重要的作用:它在系统中起到了承上启下的作用,管理机柜接收上级系统的命令和被控制体所需的参数,控制机柜串口接收并传送给被控制体。这种工作方式要求整个传送过程有非常低的误码率,不能连续出现两次以上的误码率。在进行某次调试时发现控制机柜发送给被控制体的报文中出现了不同程度的重帧。在被控制体硬盘中查看control2.dat报文数据,可以看到某流水号重复了3次,见图1所示。
技术人员首先查看了硬件和软件,未发现任何有疑问的地方。随后搭建了一套测试系统来对控制机柜进行测试。测试的方法采用了与真实系统类似的方式:用PC104系统和串口板组合模拟管理机柜系统,以同样速率、频率向控制机柜发送相同的报文。测试验证系统为:模拟管理机柜→控制机柜→被控制体,通过串口通讯传输。
经过长时间的测试验证,技术人员发现控制机柜发送给被控制体的通讯报文非常正常,未出现真实设备中出现的重帧现象,此种现象表明控制机柜的软硬件配置能够适应这种使用情况,未模拟出真实使用情况下的故障状态。随后技术人员在查看管理机柜软件记录下来的WINDVIEW的波形时(WINDRIVER公司的tornado操作系统提供一种叫WINDVIEW的功能,用图形方式实时查看系统中各个任务的运行情况),发现管理机柜发送串口数据的任务(ComSendTask)会被一个系统级的网络任务(jetCardSpy)打断,此时就会出现控制机柜发送给被控制体的数据重帧现象,而在管理机柜串口发送任务没有被打断的情况下,控制机柜发送给被控制体的数据都是正常的[4]。管理机柜记录下来的波形图显示有重帧,局部放大图如图2所示。
根据以上情况分析,技术人员发现由于控制机柜使用理想状态下的串口数据接收方法导致了这种重帧现象的发生。串口接收数据采用UART的16个字节的缓存功能,也就是串口在接收到16个字节后发送一个中断给CPU,通知运用程序开始接收数据。管理机柜在发送16个字节过程中不出现间断的情况下,控制机柜能正确的接收到串口数据。如果管理机柜在发送的时候被其他的任务打断,即某个字节发送完后(不满16个)要等一段时间才能发送出后续的字节,由于UART在接收到一定数量的数据后超时等待接收同样也会触发一次系统中断,此时控制机柜也会去接收串口中的数据,而且也会一次性接收16个字节。由于此时串口并没有完整的16个字节,所以未发送完的数据将会被填充为0,从而造成了控制机柜接收的数据后半段都是0,导致后续的校验和判断出错。在判断出错后,控制机柜会将上次接收到的完整数据发送给被控制体,这样就造成了被控制体接收到了相同的数据(重帧)。
4 提高串口通信可靠性的措施
针对上述分析出来的重帧原因,采取以下四种措施,可以提高串口通信的可靠性。(1)通过WINDVIEW波形图可以看到,正常串口接收情况下,发送给CPU的中断间隔时间在2ms~3ms。本措施是在软件中增加一个全局变量Counter记录每个串口中断到来的时刻,如果下一次串口中断到来时与上一次记录下来的时刻相减结果大于5ms,则认为此中断为无效中断,将此次接收的数据清空,重新开始搜寻报文的报头以接收下一帧。(2)每次从头开始接收串口数据时,控制机柜软件必须搜寻本次报文的报头,之前接收的数据无效。这种措施能够大大的消除由于线路上的干扰造成的串口接收端的乱码。(3)在原有一个全局的接收缓存外,再增加一个全局的接收缓存。两个缓存相互不干扰,第一个缓存用来接收串口的数据,其他任务利用第二个缓存中的数据判断设备当前的状态。(4)若管理机柜串口数据在发送第一帧时,发送任务被中断,导致控制机柜的串口中断由超时触发,则接收数据可能为全0。本措施是在控制软件读取串口数据前,增加一个对接收缓存器是否为空的检测,若接收缓存器为空,则不要接收此帧数据,重新开始接收下一帧数据,确保控制机柜能正确读取接收缓存器中的数据。
5 效果
采取以上四种措施后,运行程序,从被控制体硬盘中再次调取control2.dat报文数据,查看数据结果,没有重帧,在后续的工作中,软件运行正常,均取得合格的结果。
6 结语
虽然串口设备是现在比较常用的通讯设备,技术也相当成熟,但是如果没有正确的使用方法也不能达到串口乃至程序所需的精確度和误码率。本文对控制系统中发生的串口通信“重帧”问题采取了四项改进措施,有效地消除了“重帧”现象,提高了数据的可靠性。
参考文献
[1]潘方.RS232串口通信在PC机与单片机通信中的应用[J].现代电子技术,2012,(13):69-71.
[2]彭红.VxWorks实时操作系统的串口通信设计[J].中国科技信息,2011,(5):90-91.
[3]陈智育,温彦军,陈琪.VxWorks程序开发实践[M].人民邮电出版社,2004.
[4]李洪亮,等.VxWorks下实时多任务程序的实现[J].微计算机信息,2008,(20):90-91.