数据采集系统串口通信
2021-05-25李宇洋
李宇洋
(中国联合网络通信有限公司 黑龙江省分公司,黑龙江 哈尔滨 150056)
0 引 言
串口通信具有传输距离远、成本低以及抗干扰能力强等优点,在计算机通信领域占有重要地位,已被广泛应用在实时监控与工业自动化系统中。基于此,开发一个传输效率快且实用性强的串口数据通信系统有着十分重要的意义。
1 串口数据通信
串行数据通信是指计算机与外部设备之间通过计算机串行接口进行数据采集和数据传输。串行接口一般是指计算机COM接口,是通用设备的通信接口,串口连接到鼠标等外部设备,是外部设备与计算机系统之间进行数据传输的通道。如果计算机没有串行端口,则可以使用USB适配器将USB接口转换为串行端口。由于该装置使用方便,可以实现超长距离的数据传输,因此工业自动化系统中的数据通信一般采用串行接口。
使用串行接口进行数据通信时,首先设置静止位置和配对检测位置,其次打开串行接口等待接口数据通信(即读取或发送数据到串行端口),最后当数据通信完成时关闭串行端口并释放资源。在VB6.0环境下,利用MSComm实现串行通信。MSComm控制隐藏串行通信过程,用户只需要编写少量的程序代码就可以实现数据通信。检测方负责检测所有重要程序功能的事件和通信错误,并确定和验证注释属性的值。如果MSComm控件用于数据通信,则每个控件都属于一个串行端口。如果应用程序需要多个串行端口,则需要添加MSComm控件[1]。数据采集通信系统实物如图1所示。
图1 数据采集通信系统实物示例
2 3种通用接口和通信标准
当人们使用计算机时,外围设备不直接连接到中央处理器(Central Processing Unit/Processor,CPU),通常通过接口交换信息。接口设备包括内部设备和外部设备,其中外部设备包含特定的主机和操作器,使用接口协议可将不同的外部设备一起连接到主机和CPU。外部设备的操作过程所涉及的环节少,操作起来相对简单。应用特殊的外部设备接口技术或输入/输出接口技术,根据接口数据有效判断应当使用并行总线接口还是串行总线接口。并行接口速度快、实时性好,但线路多、复杂度高。串行接口的数据传输速度通常较慢,但正确率高[2]。并行接口设计为输入和输出接口,可以实现实时的数据输入和输出,即在同一接口中输入和输出使用相同的双向路径。串行通信和并行通信可用于计算机之间或计算机与终端之间的数据传输。在远程传输的情况下,串行通信在实际应用中可以有效避免多线路偏差。其设置了两个通信标准接口,以便不同的设备可以轻松连接和通信。rs-223-c接口(iso-22-c)是最常见的串行通信接口,其是基于RS-232标准的串行通信接口标准进行重新改造的。
3 通信协议
Modbus是一种串行通信协议,是施耐德电气公司在1979年为使用可编程逻辑控制器((Programmable Logic Controller,PLC)进行通信而发表的。目前Modbus已经成为工业通信协议的行业标准,在工业电子设备中被普遍使用。Modbus通信协议分为两种串行通信模式,即美国信息交换标准代码(American Standard Code for Information Interchanged,ASCII)通信模式和远程终端单元(Remote Terminal Unit,RTU)通信模式。协议由起始位、设备地址、功能代码、数据、检查位以及结束符号组成[3-6]。
NMEA 0183是为海用电子设备建立的标准格式,NMEA 0183协议使用ASCII码传输GPS定位信息的外在表现为帧,帧格式包括$Aaccc、DDD等。其中,“$”为帧命令起始位;“Aaccc”为地址域,前两位是标识符(Aa),后三位是标识符(ccc);“DDD”为数据内容。同时,该种协议还存在两种数据处理方式,即连续方式和指令方式。连续方式是主机不需要发出命令,可以自动从机器向主机发送数据;指令方式则是主机向从机发出指令,从机根据指令执行操作并响应主机。导航设备通常采用连续方法,等待所有的数据建立联系之后可以连续上传数据。传感器和控制器通常采用读/写命令查询数据,并保证能够控制控制器。自定义协议通常具有固定的数据内容,单个监视设备采用连续方法,数据内容多、频率要求不固定、配备指令设置的测控装置则采用指令方法。
4 数据处理
数据处理主要包括数据读写、数据包处理,为保证数据完整有效的解析,不同的协议下数据处理方法也有所不同。
4.1 连续方式
连续方式下往往会因通信延时、中断等导致数据端口会出现数据长度不够一帧或超出一帧的情况,对此主要考虑数据读写速度匹配性及数据包粘包/半包的问题。
根据通信数据长度,将其分为定长和变长两种。定长数据处理根据端口数据长度控制数据读取速度,端口数据不够一帧长度时循环等待,大于等于一帧长度时全部读回。在新的情况下,必定要从上一次断帧数据开始进行核实,等待核实完毕之后再读取新的数据。通过查找帧头并读取固定长度数据的方式拆包,取出完整数据包,并保存剩余断帧数据,通过“帧头+固定长度”的方式解决粘包/半包的问题[7-9]。变长数据处理根据数据产生频率(循环周期)控制数据读取速度,定时循环将端口数据全部读回,前提是端口数据长度大于零。读取后对数据尾部先进行帧尾判断,若是帧尾,即为完整数据;若不是帧尾,将断帧数据截取保存。数据不为空时,再将上次的断帧数据与本次的数据连接,完成解析处理。通过“帧头+帧尾”的方式拆包解决粘包/半包的问题。定长数据读取速度根据端口数据长度控制,有数即读。但考虑线程资源,通常设定50~100 ms循环周期,从而保证资源的合理分配。定长数据处理方式和变长数据处理方式针对数据堵塞时的处理结果略有不同。定长数据处理方式将拥堵数据读回快速循环处理,最大程度保证数据的完整性;变长数据处理方式将拥堵数据读回,但仅能读取一帧且会由于人为因素造成少量数据丢失,得到的数据并不完整,甚至存在着误差。
4.2 指令方式
指令方式的数据处理方法相对连续方式简单很多,建立连接后根据测量/控制周期发送指令,等待接收数据。不超时时,格式检验成功后解析数据;超时或校验不成功时,等待进入下次循环。这种指令方式主要分为一问一答和一问多答两种情况。一问一答时,发一条收一条即可;一问多答时,发一条后,循环读取多条指令,直至显示为“结束指令”之后才可发送下一条指令。此外,有些设备自带接口函数,直接调用其读写函数即可。
4.3 数据包处理
数据包处理通常根据协议内容格式进行处理。协议内容通常有固定位置定义和指定字符索引两种。固定位置定义以MODBUSRTU为例,即“起始位(1个字节)+设备地址(1个字节)+功能代码(1个字节)+长度(4个字节)+…+校验码(2个字节)+结束符(1个字节)”,将数据包格式化成数组,索引相应位置字段即可。指定字符索引以NEMA协议为例,即“$aaccc,ddd,ddd,,,,ddd*hh(CR)(LF)”,根据地址域字符找到所需的数据帧,使用分隔符拆分字段后再根据字段定义解析。针对多台设备连接数据处理或程序数据量较大时,建议采用并行结构,将数据读取和数据处理分线程并行处理。
5 API函数库串行通信的设计与实现
API函数库串行通信系统的设计思路是所涉及的串口数据触发传输设备触点时能够依据现实情况对其进行自动计数,通过网络在指定的时间间隔内将计数数据传输到接收传输设备中,最终让数据传输设备将接收的数据通过串行接口传输到数据通信软件。数据通信软件通过串行接口接收数据并存储到数据库,同时软件以图表或其他方式显示最终的数据,增强数据的易懂性。基于API函数库的串口数据通信软件采用VS2012集成开发环境,存储数据库采用Access2013。设计串口数据通信通用类,充分发挥面向对象程序设计的优势,提高程序的通用性和可移植性,实现串口通信接收文件的建立、打开串口以及数据接收转换。打开串口方法名为open,实现过程是先建立串口参数及标志,并设置结构体变量dcbCommPort和超时结构体变量ctoCommPort,然后调用外部方法Create-File建立串口文件并打开。如果返回的句柄无效则提示错误信息,否则设置通信超时时间。调用外部方法GetCommState方法取得串口状态参数,调用SetCommState方法设置串口参数。如果出现错误,则抛出异常,否则设置串口状态为打开[10]。串口数据通信在接收数据前要先打开串口,在程序设计的主窗体上添加“打开/关闭”按钮,用于打开或关闭串口。“打开/关闭”按钮的代码主要包括按钮的Click单击事件和打开串口的方法OpenCom-Port,在窗体级声明串口通信通用类对象_myserialPort,实现串口的打开、关闭、接收数据。
6 结 论
根据系统实际需求构建多层次的组成结构框架,可在满足物理层接口标准的前提下实现对数据的传输,保障数据采集系统能够快速实现数据采集与传输,同时实现数据内容的共享,从而达到理想的通信效果。通过调用系统API库中的串口实现数据采集,同时系统实际所应用到的硬件较少且传输速度快,可有效满足高标准、远距离的数据通信需求,具有较强的实用性。