车机控制长连接数据通信方法

2022-10-29 04:51韦忠杰
汽车与新动力 2022年5期
关键词:服务端数据包线程

韦忠杰

(柳州市华创汽车设计有限公司,广西 柳州 545616)

0 前言

车机端的开发主要分为主处理器(SOC)与微控制器(MCU)的开发,其中SOC负责人机交互及相关功能实现(基于Android系统、Linux系统、WinCE等系统),MCU主要负责车机电源管理与整车控制器域网(CAN)数据收发。MCU为SOC提供车辆信息,SOC对车辆信息处理后提供服务,二者间正常通信是提供服务的基础,CAN数据与整车电源变动的信息是被动获取的,因此二者间的通信连接需要处于长连接状态,以保证数据的及时响应与处理。

车机SOC与MCU一般通过通用异步收发传输器(UART)/串行外设接口(SPI)进行长连接数据传输,在此过程中数据处理不完善、通信中出现异常、不能及时处理等问题均会导致车机功能异常,因此良好的通信处理流程和通信链路状态的检测及恢复是非常重要的。

1 长连接通信

长连接通信需要对端与端的连接进行维护,同时增加连接的保活机制及异常检测与处理。以UART为例进行长连接通信的数据传输作为研究对象进行解析。

在SOC与MCU的长连接过程中,存在SOC向MCU主动发送请求的情况,也存在MCU主动向SOC发送信息的情况,双方都需要进入通信收发准备,并进行通信收发处理及通信状态同步。

1.1 通信准备

在SOC与MCU的长连接过程中,通信准备需要双方都打开通信接口,共同完成通信参数设置。如果二者通过UART进行通信,则双方需要进行以下操作:① 打开指定UART端口;② 设置波特率(需要双方设置相同参数);③ 设置数据位(需要双方设置相同参数,一般设为8 bit);④ 设置停止位(需要双方设置相同参数);⑤ 设置奇偶校验位(需要双方设置相同参数)。

通信参数设置完毕后,即可进行数据通信。通信流程主要分为数据发送与数据接收,其中数据发送是主动触发的,数据接收是被动获取的,需要分开进行处理。数据发送与数据接收流程如图1所示。

图1 数据发送与数据接收流程

1.2 通信收发处理

由于频繁的通信交互会产生大量数据,需要防止通信过程中数据遗漏或被覆盖,因此数据收发后需要及时处理,数据发送完成后再进行删除。

通信数据的发送与接收处理流程如图2所示。

图2 数据发送与接收处理流程

通信数据的接收处理考虑到数据完整性及主线程响应慢的情况,主要分为以下2个步骤:① 将收到的数据拷贝到特定数组中,并与数组中已有数据进行拼接,拼成完整的数据帧供后续处理。由于同一时间发送数据较多,所以可能会出现数据分开多次发送的情况。② 特定线程对数组中的数据进行数据帧解析,从数据帧解析出有效数据,并将有效数据发给主线程进行处理,同时从数组中删除相应的帧数据。由于数据解析处理耗时,因此需要放到其他线程处理,防止主线程阻塞响应慢的情况。

通信数据的发送处理分为数据打包与数据发送,主要分为以下2个步骤:① 根据收到的信息将要发送的数据进行打包,并将打包好的数据帧放入信息链表中,防止数据遗漏发送或数据覆盖情况;② 特定线程对信息链表进行检测,检测到有信息时,则从信息链表中获取数据帧进行发送,发送完后将对应的数据帧从信息链表中删除。因信息链表循环检测与数据的发送比较耗时,为防止主线程阻塞响应慢的情况,需要放到其他线程中进行处理。

1.3 通信状态同步

在进行数据通信前,需要做好通信准备并同步连接状态后,才能进行有效的数据传输。如果SOC在启动过程中存在电压不稳的情况,可能会出现干扰数据通过链路传输给MCU端,如果不进行状态同步,则可能会导致异常情况出现。

SOC与MCU间的关系类似于网络通信中的客户端与服务端。MCU作为服务端需要确认与客户端的连接情况,决定是否向客户端发送数据及响应客户端发送的数据;SOC作为客户端,与服务端进行正式的数据通信前,需要先发送一串连接数据帧,告知服务端通信已准备好并进行连接,服务端收到数据并解析出连接数据帧后,反馈给客户端,可以开始进行数据通信。通信状态同步流程如图3所示。

图3 通信状态同步流程

由于SOC与MCU间一直处于连接通信状态,不需要同步断开通信的情况,只有在机器休眠或关机的过程中才会断开,休眠唤醒或重启后MCU端会将连接状态清除,并重新等待SOC的连接数据帧,SOC需要重新设置参数,并发送数据连接帧进行通信。

2 长连接“心跳”机制

在整个通信周期中,可能有较长一段时间双方是没有交互的,在这过程中可以通过“心跳”机制判断通信链路状态。

“心跳”机制是指定时发送一个简短的数据包,检测连接是否正常。客户端应用层使用定时器,定时向服务端发送一个简短的数据包,然后等待服务端回应,如果在一定时间内没有收到服务端回应,则认为是连接异常;同时,服务端在已连接的情况下,收到客户端的“心跳”数据包后,及时应答对应数据包,如果固定时间内未收到“心跳”数据包,则认为连接异常。

如果服务端和客户端有频繁的数据通信往来,这些数据包本身就可以用于检测连接情况,无须一直定时发送“心跳”数据包来增大通信数据量,因此可以将“心跳”数据包与正常数据包结合起来使用。优化后的“心跳”机制流程如图4所示。① 客户端设置一个定时器,用于定时发送“心跳”数据包;② 客户端需要判断信息链表中待发送的数据帧是否发送完毕归零,发送完毕后则将计时器归零后并启动定时器开始计时;③ 客户端如果在定时器运行计时过程中有新的数据帧要发送,则将定时器暂停;④ 客户端发送数据帧后,一定时间内未收到服务端反馈的处理信息,计时时间到后则认为通信链路异常;⑤ 服务端设置一个定时器,用于确认通信链路状况;⑥ 服务端每次接收到客户端的数据帧后,则将定时器中的计时器重新归零处理,且将每次处理的结果反馈给客户端;⑦ 如果服务端一定时间内未收到来自客户端的信息,计时时间到后则认为通信链路异常,并停止服务,等待服务端重新连接。

图4 优化后的长连接“心跳”机制

3 长连接纠错与处理

根据长连接通信的内容已经可以让双方进行数据通信,并对数据的收发进行处理,而长连接“心跳”机制则能更进一步协助双方进行通信链路状态的检测,从而及时发现通信链路异常并进行简单的断开处理。

但仅靠检测到异常就进行断开处理并不是最佳处理方法。需要对通信链路尝试修复,从而继续提供服务,且在异常出现时,将发送的数据进行保存,然后进行重发,即要求具有数据重发机制,防止重要数据的遗漏。因此,在上述的长连接通信与“心跳”机制上增加通信重连功能与数据重发机制,可让长连接通信更加可靠。

3.1 通信重连功能

通信重连就是将原有的链路端口关闭后重新打开,设置初始参数后,重新进行状态的同步操作。在长连接通信过程中可能会出现异常且不可逆转的情况,需要通过通信重连功能恢复通信,一般发生以下情况时需要通信重连:① 硬件设计缺陷导致偶发的电磁干扰,电磁干扰可能导致正在传输的数据遗失或导致链路异常,如果只影响一瞬间则可以通过数据重发机制解决,否则需要通过通信重连进行处理;② 通信客户端软件异常,例如数据能发送成功但接收不到服务端反馈的数据,一定时间后则需要重连来恢复通信状态,并重新向服务端发送数据;如果进程异常,则需要重启进程后再重连,这种情况下会导致短时间内的通信断开,存在数据丢失的情况;③ 通信服务端软件异常,如果能收到数据但不能发送数据,需要服务端处理异常后重连恢复通信状态,然后向客户端回馈数据。

3.2 数据重发机制

长连接过程中出现异常,一般处理后都需要通过数据重发机制来维持之前通信状态,确保数据完整性并进行响应。数据重发机制主要由2个部分组成,即发送数据帧的保存与删除,重发次数及时间间隔。

可对“从信息链表中获取数据帧发送给远端后立即删除数据帧”的流程进行修改,改为“从信息链表中获取数据帧发送给远端,待收到远端的相应反馈后,再从信息链表中删除相应的数据帧”。

重发次数可根据具体功能要求而定,一般设置3次,如果发送3次都未收到反馈,则基本可以认为通信连接异常。关闭通信连接并重新设置连接通信,发送次数重新统计。时间间隔可设为固定,也可将重发时间间隔逐渐加大,如设置为200 ms、400 ms、800 ms。

4 长连接整体流程

整个长连接通信的实现按软件功能可分为数据发送、数据接收、通信状态检测和异常处理4个部分。由于客户端与服务端框架大致相同,再次对客户端通信流程进行分析,如图5所示。由图5可知该框架流程的软件实现涉及到数组、链表、线程、线程同步与定时器的使用。各功能大体流程如下:

图5 客户端通信流程

(1) 主线程。接收应用数据后将数据打包放入待发送链表中,同步通知数据发送线程;监听接收到服务端数据,将数据放入数组中进行拼接,然后同步通知数据接收处理线程。

(2) 数据发送。线程中判断发送链表是否有数据,如果发送链表有数据,则获取数据进行发送,取消定时“心跳”机制,并启动服务端返回状态检测机制,如果一定时间未检测到数据返回,则进入数据重发;如果发送链表无数据,则启动定时器进入“心跳”模式,定时发送数据。

(3) 数据接收处理。线程从数组中解析出数据帧,进行数据解析后,删除数组中获取的数据帧并删除发送链表中的数据,通知发送线程继续进行下一帧数据的发送。

(4) 通信状态检测。数据发送线程发送数据后,启动定时器确认一段时间内是否有数据反馈。如果数据接收处理线程中检测到有对应数据返回,则同步取消定时器;如果没有对应数据返回,则认为通信异常。

(5) 异常处理。一定时间内接收不到返回数据,则触发重发机制,如果重发3次都不能接收到数据,则认为通信异常不可恢复,需要重新进行通信设置连接。

5 结语

本文提供了一种车机内部SOC与MCU的长连接通信软件的实现方式,在满足基本通信功能的基础上,根据长连接特性增加了通信状态检测、数据重发、通信重连及“心跳”机制,尽可能地保证长连接通信的有效性。

猜你喜欢
服务端数据包线程
基于时隙ALOHA与NOMA的通信系统性能分析
实时操作系统RT⁃Thread启动流程剖析
实时操作系统mbedOS 互斥量调度机制剖析
C#串口高效可靠的接收方案设计
多人联机对战游戏的设计与实现
基于三层结构下机房管理系统的实现分析
基于三层结构下机房管理系统的实现分析
采用ScheduledThreadPoolExecutor执行定时重试任务时内存溢出的分析及解决
网络数据包的抓取与识别
Java的多线程技术探讨