改善传统通信模式提高数据采集的实时性华泽玺王长林肖鹏(西南交通大学计算机与通信工程学院四川成都610031)摘要:针对实时数据采集,提出了主动发送/串口监听模式的实时数据采集方案,即建立智能设备主动向串口发送数据,应用计算机多线程技术建立串口监听线程的采集方案。该方案改变了传统的握手、数据传输、断开连接的模式,改善了串口数据采集的实时性,并已经得到了实际应用。关键词:串口;通信;串口监听;数据采集;实时性1前言随着测控系统自动化、智能化的发展和计算机技术在生产中的广泛应用,大量数据需要实时采集。实现数据采集主要有两种方案:采用PCI接口的A/D转换卡和智能传感器。PCI接口的A/D转换卡不太适合远程数据采集。智能传感器具有高精度、自适应、可靠、稳定、可维护和可扩展[1]等优点,且传输距离可达1.2km[2],适合远程数据采集。但是常规智能传感器,使用串口接收数据时,实时性相对于A/D卡较差。针对此问题,本文提出了主动发送/串口监听模式的数据采集方案。该方案改变了传统的握手、数据传输、断开连接的传输流程[3]模式,改善了串口实时数据采集的实时性。当数据帧比较短时,该方案的实时性的优点尤其显著。2改进方案设计思想在常规数据采集方法中,第一种用PCI接口的A/D转换卡,将采集的信号引到计算机后再进行转换。第二种采用智能传感器的数据采集,经过现场采集,模拟信号转换为数字信号,通过RS-485或RS-422经转换后传入RS-232接口。第二种采集方法有许多优点,目前被广泛采用。但其时实性较第一种差,为此我们首先从智能传感器的通信协议分析入手,找出智能传感器数据采集方案实时性较差的原因,进而提出新方案。智能传感器的通信协议设计思想基于帧传输方式[3]。为确保可靠的传输,在开始传输前通过握手建立连接,在每一帧传输中采用发送/应答/重连/失败方式。用于数据传输的帧有二种,数据帧和控制帧。数据帧包括帧头、负载数据和校验码。控制帧只有帧头,帧头中包含控制信号,控制帧和控制信号合作完成通信同步的任务。本文以高速数据链路控制/同步数据链路控制(HighSpeedDataLinkControl/Syn-chronousDataLinkControlHDLC/SDLC)协议为例讲述控制帧[4]。不失一般性,控制帧(即帧头)长至少为6个字节,如表(1)表(1)传输控制帧格式帧开始标志帧发送地址控制信号CRC校验冗余码帧开始标志(1byte)(1byte)(1-3byte)(2byte)(1byte)控制信号为:constBYTESYN[1]={0x1}//请求constBYTEACK[1]={0x2}//响应constBYTERESEND[1]={0x4}//重发constBYTEBUSY[1]={0x7}//忙constBYTEBYE[3]={6,0,6}//断开连接constBYTESTR[1]={0x3}//短信息同步信号通信采用握手、数据传输、断开连接的模式。其中握手过程至少产生四个帧:发送SYN信号、控制首帧和两个ACK响应帧;断开连接过程至少产生四个帧:准备结束此次通信ABORT控制帧,断开连接BYE信号帧和两个ACK响应帧。在负载数据量较小的情况下,如只有6个字节数据,而握手和断开的过程已有8帧×6字节/帧=48字节,这样控制帧占用了通信的大部分时间,再加上设备对控制帧的响应时间,显然在这种模式下工作,通信中用以传输我们真正需要的有用数据的时间在总的传输数据时间中所占的比例较小,因而造成实时性相对较差。在多路采集中,这一问题更显突出。根据通信协议的上述特点,为了提高其实时性,我们提出主动发送/串口监听模式的数据采集方案。所谓的主动发送是指智能传感器设备传输数据时,不需要握手的过程和断开连接的过程,这样就能节省许多时间。而串口监听是计算机通过多线程技术,对串口进行数据监听,采用事件驱动方式。通过设置事件通知,当所希望的事件发生时,Windows发出该事件已经发生的通知(这与DOS环境下的中断方式很相似)。一旦监听到串口有字节数据来到时,立即接收到缓冲区,并发出事件通知。为确保可靠的传输,防止串口之间的通信事件冲突,我们采用每个串口设一个缓冲区并由一个线程来监听。现代计算机响应事件时间是微秒级,而实时数据采集时间是毫秒级,因此,现代的计算机实现多路数据采集是完全可以的,实验结果显示,在9600bps速率下,对于20路之内的数据采集是可以解决事件冲突问题。通过上述处理,就无须握手和应答的过程,确保了数据采集的实时性。3串口数据采集框架智能传感器一般采用超大规模集成电路,将微处理器、ROM、RAM、A/D转换器和I/O接口集成在一块模板上,利用固化的软件程序协调内部操作,可完成输入信号的非线性补偿、零点错误、故障诊断等。其典型的结构如图(2)所示,采集系统硬件结构如图(3)所示。经典传感器信号处理电路输出接口图(2)智能传感器结构示意图被测点微处理器数值量输出现场设备智能传感器RS-485转换RS-232RS-485总线数据采集线接入计算机现场设备智能传感器RS-485转换RS-232RS-485总线数据采集线现场设备智能传感器RS-485转换RS-232RS-485总线数据采集线图(3)实时采集系统硬件结构示意图4主动发送/串口监听模式4.1修改智能传感器的中断服务程序,建立智能传感器的主动发送实现串口的实时采集,首先,对智能传感器设备的中断服务程序进行修改,对智能芯片的控制程序进行重新写入,使模拟设备的信号进行实时的数据转换,按照事先给定的通信协议,定时不间断地向串口发送数据帧。该软件采用模块化结构,微处理器程序包括初始化、信号处理、转化为十六进制数,按指定地址和通信协议定期不间断地向RS-485发送数据。限于篇幅,各软件模块的程序在此不作一一介绍。主程序和串行口中断通信服务程序的框图如图(3)所示。A/D采样图(4)修改后智能传感器主程序和串行口中断通信服务程序的框图开始串口初始化上电自检数字信号处理按定时器设定时间开中断启动定时器数据处理等待中断串行口中断服务程序将发送数据放入FIFO关中断向RS-485总线发数据开中断中断返回按通信协议组织数据转化为十六进制数并加入校验码4.2建立计算机多线程和串口监听模式串口监听是利用计算机多线程技术,进行事件触发,监听串口数据,进行实时处理。实现这一方案的关键所在是首先建立一个通信的类。根据文献[5]实现步骤如下:·加入宏定义、类定义与成员变量,串口初始化成员函数InitPort(CWnd*pPortOwner,//接收信息指针UINTportnr,//端口号(1..4)UINTbaud,//RS-232接口的波特率charparity,//奇偶校验UINTdatabits,//数据位UINTstopbits,//停止位DWORDdwCommEvents,//接收字符事件UINTwritebuffersize)//写缓冲区·加入串口监听成员函数StartMonitoring();根据串口的多少决定启动线程的数目。·加入串口监听线程静态函数CommThread(LPVOIDpParam);当串口监听成员函数StartMonitoring()激活该线程后,开始无限循环,一直进行线路状态检测,等待SetCommMask指定事件之一发生,以异步方式操作串口,当串口线程有数据到达串口时,自动调用串口读函数。参考文献[3][6]实现程序关键部分说明如下:…………//开始无限循环,当该线程alive时该循环一直进行for(;;){…………//其它其它处理//检测线路状态,等待SetCommMask指定事件之一发生,事实上因为CSerialPortEx以异步方式操作串口,所以该调用会立刻返回bResult=WaitCommEvent(port-m_hComm,&Event,&port-m_ov);if(!bResult){…………}else{//WaitCommEvent以后,要用ClearCommError清除事件的Flag,以便进行下一轮//WaitCommEvent,同时这个API可以获得更详细的事件信息bResult=ClearCommError(port-m_hComm,&dwError,&comstat);//确认串口中无字符则进入主监视过程,重新开始循环if(comstat.cbInQue==0)continue;}//endifbResult//主监视函数,该函数将阻塞本线程直至等待的某一事件发生……………}·加入串口读函数ReceiveChar(CSerialPort*port,COMSTATcomstat);当串口线程监听到有数据到达串口时自动调用串口读函数,开始无限循环,每次读取一个字节发送WM—COMM—RXCHAR消息至父窗口,直至缓冲区中所有数据读取完毕。·加入属性获取和错误处理函数。对端口数据采用事件驱动方式,事件驱动方式通过设置事件通知,用SetCommMask()函数指定了有用事件后,应用程序可调用WaitCommEvent()函数来等待事件发生。根据文献[7][8]UML统一语言软件顺序图如下:串口初始化串口监听线程串口读与处理函数等待SetCommMask指定事件之一发生事件发生自动调用字符接收函数错误返回事件处理完毕后返回串口监听线程CWnd*pPortOwnerUINTportnrUINTbaudcharparityUINTdatabitsUINTstopbitsDWORDdwCommEventsUINTwritebuffersize图(4)多线程串口监听核心程序软件顺序图4.3主动发送/串口监听模式实时采集方案的实现及优点主动发送/串口监听模式,去掉握手、断开过程中帧的传输和响应时间,那么采集数据传输时间变得很小。若处理后的数据放在一个缓冲区中,在19200bps传输速率情况下,则可以认为缓冲区中的数据是直接从设备上采集过来的数据,可以根据需求,随时从这个缓冲区中取数据,以实现数据的实时采集。这种采集方法相对于采用PCI接口的A/D转换卡和智能传感器数据采集有以下优点:1.RS-485实现了多点互连,易实现系统的冗余,提高设备的可靠性、健壮性;2.通过中间的智能设备进行采集,提高系统的可维护性、可扩充性,可移植性;3.系统采用的是RS-485或RS-422作为传输线,采集的数据可以长距离传输,RS-485在100Kbps时传输距离可达1.2km,RS-422在90Kbps时传输距离可达1.2km[7],在这对数据采集非常有利;4.自适应性强,智能传感器具有判断、分析与处理功能,它能根据系统工作情况决策各部分的处理,使系统工作在最优低功耗状态和传送效率优化的状态[6];5.对于短数据帧该方案采集实时性明显高于常规智能传感器。5实验结果与分析在实验中,如用A/D转换卡,通过PCI插槽进行数据采集,和同主动发送/串口监听模式方案相比,在实时性方面,几乎是具有相同的效果。实际测试中,我们使用P4计算机(CPU:2.66GHz;主板:超线程技嘉8I875P),普通通信协议的智能传感器进行单路数据采集,在9600bps速率下,通过串口把数据传入微机,每完成一次数据采集,经RS-232串口实验,在数据量小的情况下(如每次传输20字节),建立传输的时间大约在50ms~60ms之间。相同条件下进行对比实验,以主动发送/串口监听模式进行数据采集,传输几乎不占用时间。相同条件下将采集数据扩展到20路,经检验没有发生丢字节等错误。我们已经把此项技术应用于发电机测试,和对铁路现场设备的监测,都取得了成功。在发电厂发电机的数据采集中,经智能传感器采集处理过的数据,每20ms向计算机串口定期主动发送一次。一次发送的采集数据为6个字节时,采用常规串口采集模式,不能实时完成,而用这种主动发送/串口监听模式则可完成。用RS-485或RS-422总线作为长距离传输线,到微机时再转换为RS-232接口,这种方案更适合远距离的实时监测,适合铁路车站对现场设备的监测工作,有希望成为未来铁路监测的