一种串口数据帧拼接现象处理研究
2020-09-02张永龙
刘 超,张永龙
(1.航天江南集团有限公司,贵阳 550009;2.贵州航天电子科技有限公司,贵阳 550009)
0 引言
数据串口通信主要是计算机和外设间或主机系统之间的数据串行传送。串口通信的数据传输的安全性比较高,有着比较强的抗干扰能力。采取基于单片机的数据串口通信方式,正是因其集成度比较高,嵌套也较为方便以及经济性等特点[1]。通过从理论层面对单片机的数据串口通信进行展开研究分析,就能为单片机数据串口通信的实践提供依据[2]。串行通信方式具有使用方便、传输可靠、信号线数量少等优点,因而倍受青睐[1]。
本课题源于某型调温控制系统,在调温系统内部采用了基于FPGA+C8051单片机架构的控制模块作为内部控制器的核心器件,在FPGA和单片机之间使用串口进行数据交互。在该调温系统设计中,出现了调温系统上位机控制软件从FPGA+C8051单片机模块中获取的测温数据、工作状态信息数据等出现数据错误等异常现象,使得该调温系统工作不能达到预期设计要求。为了获取该调温系统内部引起数据错位的原因,开展了该课题的研究。
在该调温系统设计中,上位机控制软件通过ModBus TCP通信协议先FPGA+C8051单片机模块发送控制指令或查询数据,实现对该调温系统的自动或手动调温操作,并通过查询指令实时监测调温系统的工作状态。在该系统设计中,C8051单片机通过控制CP2200实现与上位机控制软件的通信,FPGA通过控制调温系统的其他设备,实现系统调温功能。在FPGA与C8051之间,使用串口进行数据交互,当上位机控制软件通过以太网通信总线向C8051单片机模块发送控制指令后,单片机控制串口将控制指令发送FPGA,FPGA控制软件对指令进行解析后,输出调温控制信号,实现调温控制。同时,在FPGA工作过程中,需要获取调温系统的测温温度数据和工作状态信息,故障码信息等,并通过串口以一定的周期实时向单片机发送。单片机接收到FPGA通过串口发送过来的调温系统数据信息后,通过以太网数据帧封装后,将数据发送至上位机控制软件。
在单片机内部,采用串口接收中断对串口数据进行处理,当一个串口数据到达时,单片机串口接收中断标识置位为1,单片机进入中断处理程序实现对当前串口数据的接收和处理;同时单片机控制CP2200接收上位机的以太网数据信息时,启动了一个优先级更高的中断,当该单片机软件接收到上位机数据后,直接进入以太网接收处理,若此时串口中断正在执行,则该中断就被高优先级的中断打断,出现中断嵌套现象,且进入以太网接收中断处理后,单片机软件将串口接收中断关闭,这使得未能实现一帧完整数据接收的单片机控制软件出现了数据帧拼接,导致数据错位等异常现象的出现。
本课题的主要研究单片机串口关闭对一帧完整串口数据帧接收带来的影响,并通过实验监测手段验证串口关闭导致串口数据帧错位的异常现象的原因。为使用串口通信的模块的软件设计中具有串口关闭的处理措施提供解决方案的借鉴。
1 系统结构及原理
在FPGA+C8051控制模块设计中,FPGA 控制软件控制软件作为调温系统各模块控制和各模块信息处理的处理器,FPGA控制软件采用内嵌软核CPU(MicroBlaze软核)实现对FPGA底层逻辑模块对AD采样的数据进行浮点计算处理和串口通信控制等处理,FPGA底层逻辑控制模块实现对调温系统控制模块的IO输入输出信号控制及AD采集处理等操作。单片机控制软件通过控制以太网控制芯片CP2200实现对状态监控计算机1和状态监控计算机2的上位机软件的网络通信,单片机控制软件与FPGA控制软件之间采用串口RS232进行短距数据交互。其中,状态监控计算机的上位机软件通过以太网接口向单片机控制软件发送控制指令后,单片机控制软件将解析后的指令通过RS232接口发送至FPGA控制软件实现调温控制。FPGA控制软件接收到控制指令后,对控制指令进行解析处理,实现对调温系统的自动调温或手动调温控制。FPGA控制软件的底层,逻辑控制模块通过采集测温模块的温度信号其其他模块的工作反馈信号后,组成了调温系统工作状态信息,FPGA控制软件通过RS232总线,以一定的周期,实时向单片机控制软件发送调温状态信息。单片机控制软件接收到调温状态信息后,通过以太网数据帧封装后,将调温状态信息发送至上位机软件。FPGA和单片机C8051串口通信架构处理模块如图1所示。
图1 FPGA+C8051串口通信架构图
2 系统硬件设计
在本系统设计中,使用美国Silabs公司推出的C8051F系列单片机C8051F040作为通信控制、DA信息转化、EEPROM存储数据处理,使用FPGA控制调温系统的温度信号采集处理、高速光耦脉冲计数处理,调温控制信号I/O输出等操作。
该系统硬件设计中,单片机控制CP2200实现ModBus TCP通信。CP2200集成了IEEE 802.3以太网媒体访问控制器(MAC)、10Base-T物理层(PHY)和8KB非易失性FLASH存储器的单芯片以太网控制器。CP2200的8KB片内FLASH存储器,用于存储用户常数、Web服务器内容或作为通用非易失性存储器。FLASH存储器的最后6个存储单元是工厂预编程的唯一48位MAC地址。
单片机通过控制DAC7800实现数模转换处理,将经过温度修正处理后的温度数据输出到控制台进行显示。单片机通过控制微芯公司生产的24LC32存储芯片实现对调温系统的调温修正参数、系统档案信息、交付测试信息等进行存储。
在该系统中采用美国Xilinx公司生产的Spartan6系列的XC6SLX16处理芯片进行AD处理、高速光耦脉冲信号检测处理、I/O控制信号输出。Spartan6特别适合于高容量的逻辑设计、面向用户的DSP设计、低成本设计:
1)每个SLICE包含4个LUT和8个flip-flops;
2)每个DSP48A1 slice包含1个18×18乘法器、1个48bit累加器、1个加法器;
3)每个18 KB的Block RAM可以用作2个9 KB的Block RAM;
4)每个CMT包含2个DCM和1个PLL;
5)在-3N 速度等级的器件里没有存储器接口(DDR接口)。
FPGA控制AD7606模数转换芯片,实现对温度信号的处理,这里选择了8通道输出的AD7606模块,实现多测温模块检测信号的处理,能多维度获取调温系统所在的环境温度的情况,并通过对测温模块的温度综合处理后,输出降温或加热的控制指令,实现调温系统对所在环境温度的控制。
在单片机和FPGA之间使用RS232进行板内通信,该接口用于传输单片机通过CP2200从网络接收的控制指令、存储器调温输出的调温修正参数等信息;同时,在FPGA控制模块对测温温度和调温控制状态信息处理后,通过该串口向单片机模块发送相应的信息。该系统的硬件设计如图2所示。
图2 系统硬件组成框图
3 系统软件设计
3.1 系统工作软件流程
该系统的控制软件由单片机控制软件和FPGA控制软件组成。其中,单片机控制软件通过CP2200的物理层进行初始处理及DA模块、EEPROM模块的初始化处理后,开始读取EEPROM内存中的温度修正参数,并通过RS232将温度修正参数发送至FPGA,FPGA接收温度修正参数后,实现对读取AD7606的温度数据进行修正处理,并将温度数据、调温系统的工作状态信息打包后,通过RS232发送至单片机。单片机控制软件在接收到CP2200的中断信息后,进入网络中断处理程序,将CP2200网络物理层缓冲区内的数据读取后,根据以太网协议对信息进行解析处理,若信息无错误,则将信息传至链路层处理模块进行处理,之后依次将数据经过网络层(IP层)、传输层(TCP层)、应用层(Modbus层)进行解析和处理;若信息为调温系统控制信息,则单片机将控制信息通过RS232发送至FPGA,FPGA接收控制指令后,对控制指令进行解析,若控制指令为自动控制指令,则调温系统工作在自动工作状态下;若指令为手动控制指令,则调温系统工作在手动工作状态下。FPAG根据指令输出调温系统的控制信号,并检测调温系统的反馈信号,生成调温系统工作状态信息。在接收到调温系统查询指令时,将调温系统的温度数据和工作状态信息通过以太网数据帧封装后,将数据发送上位机软件。系统软件控制流程如图3所示。
图3 系统软件控制框图
3.2 网络通信软件流程
在网络控制中,单片机C8051F040通过对CP2200复位初始化可以确保设备正常工作。复位开始时,首先要等待复位引脚升高,然后等待振荡器初始化完成,振荡器初始化完成后会发送一个中断信号。通过检测INT0中断状态寄存器确定CP2200初始化是否完成。
在CP2200初始化结束后,单片机通过检测CP2200的中断信号,获取以太网数据,在进入以太网接收中断程序内,单片机通过读取CP2200缓冲区内的数据,获取以太网物理层数据信息。通过对数据信息解析,将数据信息发送至链路层进行解析处理,并检测信息是IP数据包、ARP数据包还是RARP数据包,并通过不同的处理方式对相应的数据包进行处理。若数据包为IP包,则需要判读数据包为TCP数据包还是ICMP数据包,若为ICMP数据包,则通过Ping程序处理模块应答处理;若为TCP数据包,则通过应用层的ModBus应用层解析处理后,将数据包根据每一次数据帧的格式进行封装处理,将数据层层封装后,通过物理层将数据信息发送至上位机。调温系统网络数据包解析流程如图4所示。
图4 调温系统网络数据包处理流程图
单片机通过CP2200与上位机进行网络数据交互过程中,在中断触发物理层数据信息接收后,单片机需要定时对TCP层应答信息是否超时进行处理,若出现超时,则需要进行TCP重传处理。若连接调温设备的网络设备在预定的时间没有与调温系统进行数据交互,则表示该设备不活动,需要将该设备网络连接信息清除。对ARP地址解析信息超时,也启动重传处理。在ARP缓冲区内,对于MAC地址需要进行超时老化更新的机制,保证ARP地址池空间的使用满足要求。单片机对网络信息处理流程如图5所示。
图5 网络信息交互处理流程图
3.3 系统工作控制流程
单片机接收上位机控制指令后,通过RS232将控制指令发送至FPGA,FPGA对指令解析后,输出调温系统的控制信号。当控制指令为自动指令时,则FPGA控制调温系统工作在自动工作状态下,并通过读取AD7606的温度数据进行修正后,将温度数据作为自动调温控制的条件,当温度低于-20 ℃时,则开启加热设备实现加热操作。当温度数据高于40 ℃时,FPGA输出压缩机、风机的工作控制信号,实现降温操作。调温系统工作流程如图6所示。
图6 系统工作控制流程图
3.4 单片机串口接收控制流程
单片机串口接收数据时,若接收到串口数据,串口接收中断标志置位,单片机软件进入串口接收中断处理程序。在中断程序内将串口接收中断标志清零,读取串口缓冲内的数据,若读出的数据为第一个帧头数据正确,则等待进入下一次中断;若第二个帧头数据也正确,则进入串口数据保存处理程序块,串口数据保存在recdata[num]数组内;每次中断保存一个串口数据,并将recdata[num]数组下标(num)加1,即num+1(检查中发现在上电初始化中也使用num变量,num的值可能不为零,导致第一次接收数据会出现异常),用于保存下一次中断接收的数据;当接收和保存12个字节的串口数据后,进入帧尾判读处理;若帧尾(0xea)正确,则清除接收一帧串口数据的标志和数组下标(bz、num),将保存在数组内的温度数据和故障码赋值给以太网数据帧。串口接收中断处理程序如图7所示。
图7 串口接收中断执行程序图
4 实验结果与分析
4.1 系统通信数据实验异常情况
在使用FPGA+C8051架构的控制模块实验中,出现串口数据帧错位现象,其异常现象如下:
1)异常现象一
正常通讯时接收的数据为:00 eb 00 00;
异常通讯时接收的数据为:00 00 eb 00;
2)异常现象二
正常通讯时接收的数据为:00 ec 00 00;
异常通讯时接收的数据为:00 ec ec 00;
为实现串口数据帧错位问题的解决,系统软件进行排查和分析处理。
4.2 系统实验异常数据分析
对串口通信数据错位分析如下:
1)第一种数据异常现象分析:若串口接收中断在未接收完一帧完整串口数据帧时,串口接收中断关闭,在重新开启串口接收中断后,则现串口接收数据帧拼接。若拼接数据中出现与帧尾字节相同的数据字,则拼接数据帧异常,出现第一种数据错位异常机理如图8所示;(在第1帧数据和第n帧数据中灰色数据为拼接数据,其他数据丢失);
图8 第一种数据错位机理图
2)第二种数据异常现象分析:若串口接收中断在未接收完一帧完整串口数据帧时,串口接收中断关闭,在重新开启串口接收中断后,则出现串口接收数据帧拼接,且拼接数据与关闭中断前的数据一致,拼接数据中出现与帧尾一致的数据字,则拼接后的数据形成一帧完整的数据。如图9所示。
图9 第二种数据错位机理图
通过分析,当单片机接收到查询指令之后,关闭串口接收中断。如果关闭中断时,串口接收中断未接收一帧完整数据,待串口中断重新开启后,后续接收串口数据与关闭中断前数据出现拼接。当后面的拼接数据中包含有与帧尾标志一致的数据,且拼接后该数据恰好落在帧尾上,则形成一帧完整数据。
4.3 异常分析数据测试情况
由于串口数据帧由15个字节组成,其中包括两个帧头和一个帧尾,每接收一个字节产生一次中断,每次串口接收中断的间隔时间约为1 ms,接收一帧完整的数据帧(共15个字节)使用的时间约为17.2 ms(如图10所示)。
图10 串口数据帧接收时间图
通过测试,串口进入中断后,中断处理程序的最大处理时间为2.7 μs,如图11所示,中断处理最大时间远小于串口数据间隔时间1 ms,不影响下一次串口中断的触发,因此排除因素E2。
图11 串口接收中断最大处理时间
在处理完一次串口中断程序后,单片机返回主程序执行。若此时接收到状态监控计算机的查询指令,单片机关闭串口中断(串口中断允许位清零),将接收的查询指令通过串口发送至FPGA。进行以太网数据帧封装,并启动以太网发送模块,将以太网数据帧发送至状态监控计算机。当以太网数据帧发送完毕后,再次开启中断。
通过测试,单片机接收到查询指令后,从串口中断关闭到中断开启的时间约为17 ms,如图12所示。
图12 中断关闭时间图
在中断关闭过程中,单片机依次执行了将查询指令发送至FPGA、封装以太网数据帧、发送以太网数据帧等操作,其中单片机向FPGA发送查询指令的时间约为16.5 ms,如图13所示。
图13 单片机发送查询指令至FPGA的时间
将单片机向FPGA发送查询指令程序段屏蔽后,单片机从接收查询指令及应答的时间约为300 μs,如图14所示。
图14 关闭串口发送后以太网应答时间
通过对以上测试数据分析,单片机接收到状态计算机的查询指令后,单片机通过串口向FPGA发送查询指令,占用了以太网数据帧的应答响应大部分时间。该过程中串口接收中断处于关闭状态,不能接收FPGA串口发送的数据帧。当串口接收中断处理程序未完整接收一帧数据时,如果关闭串口接收中断就会导致串口接收中断数据异常。表现为串口中断将不同的数据帧拼接为一帧完整的数据,导致数据帧异常。为检查中断对串口数据接收的影响,单片机程序中,修改程序为:收到帧尾时将P12管脚置位,收到第一个帧头时P12管脚复位。中断影响效果如图15所示。上面波形为接收到也太网数据后,发送到FPGA的串口数据,可表征这个时刻单片机关闭了中断。
图15 查询指令对串口中断影响图
通过对以上测试数据的排查和分析,在接收到状态监控计算机查询指令后,单片机关闭接收中断。若关闭中断时,单片机串口未能接收完一帧完整的数据,导致开启中断后,串口中断将不同的数据帧拼接为一帧完整的数据。如果后面的拼接数据中包含有与帧尾标志(0xea)一致的数据,且正好落入第15个字节上时,则形成一帧正常的完整数据,导致数据异常。
4.4 异常分析数据验证情况
根据串口数据帧的定义,在FPGA串口数据帧中写入一个与帧尾0xea一致的数据,进行通信试验验证。
通过排查分析,串口接收中断关闭异常和温度数据中有与帧尾数据(0xea)一致的数据则会出现数据异常,为增加故障频率,将FPGA内发送到单片机的数据帧更改如下:
bf 80 00 00 00 00 00 00 00 eb 00 00 00 ea ea
4.4.1 故障现象一复现
为加快故障复现,将状态监控计算机查询周期5s更改为250 ms,在单片机串口接收中断帧尾设置监控程序,第一种故障异常的监控程序如下:
if((recdata[8] &0xfe) != 0x00)
P12 = 1;//监控信号置位
else
P12 = 0;//监控信号复位
通过示波器监控单片机P12输出的波形图,可以得出在第一种异常数据发生的频率,通过约20s数据监测,发送第一种数据异常的次数为58次,如图16所示。由图16所示,在2s时间间隔内最多出现6次数据异常,最少出现2次数据异常。
图16 第一种故障出错频次图
在单片机内串口接收中断帧尾设置如下监控程序,可得出保存串口的数组内的数据:
while(((recdata[8] &0xfe) != 0x00);//故障出现后死循环
通过试验监测,在单片机软件内监测,得到异常数据如图17所示,其中温度数据和故障码数据为:00 00 eb 00,与故障现象一致。
图17 数据错位1通讯数据包截图
4.4.2 故障现象二复现
在单片机串口接收中断帧尾设置监控程序(状态监控计算机的查询指令周期为250 ms),第二种故障异常的监控程序如下:
if((recdata[6] == 0x00) &&(recdata[7] == 0xeb) &&((recdata[8] &0xfe) != 0x00))
P12 = 1;//监控信号置位
else
P12 = 0;//监控信号复位
通过示波器监控单片机P12输出的波形图,可以得出在第二种异常数据发生的频率,通过约20s的数据监测,该异常数据共发生41次,监测图如图18所示。根据图18所示,在2 s的时间间隔最多发生6次数据异常,最少发生0次数据异常。
图18 第二种故障出错频次图
在单片机串口接收中断帧尾设置如下监控程序,可得出保存串口的数组内的数据:
while((recdata[6] == 0x00) &&(recdata[7] == 0xeb) &&((recdata[8] &0xfe) != 0x00));// 故障出现后死循环
通过试验监测,在单片机软件内监测,得到异常数据如图19所示,其中温度数据和故障码数据为:00 eb eb 00,与故障现象一致。
图19 数据错位2通讯数据包截图
根据以上两种数据异常现象的分析和试验验证,异常现象分析与试验现象一致,故障复现。通过串口数据帧中含有与帧尾0xea一致的数据,重新拼接数据帧能形成一帧完整的串口现象,导致串口数据帧错位。
4.5 软件措施更改及验证
通过降低串口数据帧中断关闭时间,仅在串口数据帧将帧内温度和故障码数据赋值给以太网数据帧的过程中关闭串口接收中断。由于串口接收中断的间隔时间为1 ms,更改后的软件在中断关闭时间内仅执行4个字节更新操作,关闭中断的时间由原来的17.2 ms变为2.7 μs,不影响串口数据的连续接收,不会出现数据帧拼接,有效解决通信数据错位的异常现象。
对软件进行更改后再进行验证。采用与出现故障时的验证方法一致,对软件进行验证。通过3天的时间进行试验监测,未检测到数据帧拼接的现象,串口数据帧监测如图20所示。
图20 串口数据帧未出现拼接图
该异常现象由关闭串口中断,导致串口接收数据拼接,单片机控制软件内除串口接收中断外,还有定时器0(1 ms定时中断)和定时器2(16.384 ms定时中断)两个中断。通过对定时器0和定时器2复查和测试,这两个中断没有被关闭现象,同时中断执行时间均小于20 μs,远小于串口数据间隔时间1 ms,不会干扰串口中断的正常执行。通过软件更改后,可以有效避免该问题。
4.6 系统实验及验证
通过对异常情况处理和验证后,对调温系统的工作情况进行实验验证,通过上位机软件向调温系统发送控制自动控制指令后,调温系统工作在自动状态下,在温度为-21 ℃时,实现了加热操作,当温度低于-20 ℃依次实验,自动加热均得到验证。在温度高于40 ℃时,调温系统工作在制冷状态。之后进行手动测试,依次完成了手动加热、手动制冷测试,均得到验证。在上位机软件发送调温系统查询软件,上位机软件获取到调温系统的温度信息和工作状态信息。经过以上实验验证,调温系统工作正常,设计功能性能得到验证。
5 结束语
本文通过优化FPGA+C8051控制模块串口中断关闭时间的处理,有效实现了因串口中断关闭时间过长导致串口数据帧拼接错位的技术问题。在该模块的通信数据中,由于单片机串口接收中断被关闭时间大于一帧串口数据帧接收的时间,导致接收的串口数据帧出现数据帧拼接、错位的异常情况。通过对串口通信处理方式进行了优化,并减小(小于2.7 μs)关闭串口接收中断的时间,有效解决了数据帧拼接的异常现象;提高了对串口接收中断数据帧拼接异常处理,并进行了系统实验验证,FPGA+C8051控制模块的功能性能均满足设计要求。该系统设计及验证的成功,为串口数据帧通信中的拼接异常提供了借鉴。