CN119201805A - 基于串口实现的多机通信数据处理方法和多机通信系统 - Google Patents
基于串口实现的多机通信数据处理方法和多机通信系统 Download PDFInfo
- Publication number
- CN119201805A CN119201805A CN202411689494.9A CN202411689494A CN119201805A CN 119201805 A CN119201805 A CN 119201805A CN 202411689494 A CN202411689494 A CN 202411689494A CN 119201805 A CN119201805 A CN 119201805A
- Authority
- CN
- China
- Prior art keywords
- data
- serial port
- queue
- receiving
- dma
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000004891 communication Methods 0.000 title claims abstract description 94
- 238000003672 processing method Methods 0.000 title claims abstract description 29
- 238000012545 processing Methods 0.000 claims abstract description 46
- 238000000034 method Methods 0.000 claims abstract description 43
- 238000004364 calculation method Methods 0.000 claims abstract description 32
- 230000005540 biological transmission Effects 0.000 claims description 50
- 230000008569 process Effects 0.000 claims description 15
- 238000004458 analytical method Methods 0.000 claims description 6
- 230000003993 interaction Effects 0.000 claims description 3
- 230000000737 periodic effect Effects 0.000 abstract description 6
- 230000006870 function Effects 0.000 description 33
- 238000010586 diagram Methods 0.000 description 7
- 230000008901 benefit Effects 0.000 description 5
- 238000003384 imaging method Methods 0.000 description 3
- 230000007246 mechanism Effects 0.000 description 3
- 230000002093 peripheral effect Effects 0.000 description 3
- 230000001133 acceleration Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000005259 measurement Methods 0.000 description 2
- 230000001960 triggered effect Effects 0.000 description 2
- 230000003139 buffering effect Effects 0.000 description 1
- 238000012937 correction Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 238000007667 floating Methods 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 238000012546 transfer Methods 0.000 description 1
- 230000007723 transport mechanism Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/14—Handling requests for interconnection or transfer
- G06F13/20—Handling requests for interconnection or transfer for access to input/output bus
- G06F13/28—Handling requests for interconnection or transfer for access to input/output bus using burst mode transfer, e.g. direct memory access DMA, cycle steal
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/38—Information transfer, e.g. on bus
- G06F13/42—Bus transfer protocol, e.g. handshake; Synchronisation
- G06F13/4282—Bus transfer protocol, e.g. handshake; Synchronisation on a serial bus, e.g. I2C bus, SPI bus
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Small-Scale Networks (AREA)
Abstract
本公开实施例提供了一种基于串口实现的多机通信数据处理方法和多机通信系统,该方法包括:为每个串口分别配置对应的DMA通道并注册接收空闲中断,创建环形队列用于保存每个周期对接收到的受控设备采集数据汇总处理后的计算结果;启动系统滴答时钟进行周期性计时,在每个计时周期的起点发送脉冲通知各受控设备开始发送数据;在接收到受控设备发送的数据后,在对应的接收空闲中断处理函数中解析数据,并将解析后的数据保存在环形队列中;在每个计时周期等待指定时间后,对各受控设备采集的数据汇总计算处理,将计算结果以DMA方式通过串口发送至客户端上位机。本方案仅用系统滴答时钟和串口便实现了高效且实时的周期性多机数据通信。
Description
技术领域
本发明涉及通信技术领域,具体涉及一种基于串口实现的多机通信数据处理方法和多机通信系统、服务端设备及存储介质。
背景技术
多机通信是多个设备之间进行数据交换和通信的过程。这种通信可以发生在不同类型的设备之间,如计算机、嵌入式系统、传感器等,目的是实现数据共享、协同工作或信息传输。尽管在通信技术高速发展的今天,多机通信不再局限于使用串口,而是使用速率更高的SPI、IIC、网线、光纤等物理总线来实现,但是出于成本和布线难度的考虑,使用多个串口,即UART进行多机通信仍然是嵌入式和通信领域的常见方式。尤其对于航空航天领域,飞行器体积设计必然会基于布线难度考虑,而体积又直接影响飞行器重量,故而对于近距离的多机通信使用仅三根线(Tx、Rx、GND)的UART是最佳选择之一。
然而,如何仅使用串口作为通信接口异步地接收汇总多机通信数据并进行计算处理,如何能保证周期性多机数据通信的实时性和准确性,如何能够保证串口通信接收方在接收解析数据流时能够避免或解决接收缓存的数据流的粘包问题以提高解包效率,如何能在串口通信传输误码或丢包的情况下迅速区别出传输错误与粘包断包现象,仍然是通信技术领域的重要技术需求和性能问题。
发明内容
鉴于上述问题,本方案提出了一种基于串口实现的多机通信数据处理方法和多机通信系统,使用硬件和软件的流控制机制来管理串口传输流和避免冲突,引入错误检测和纠正机制,来提高通信的可靠性。
根据本发明的第一方面,提供一种基于串口实现的多机通信数据处理方法,基于服务端设备实现,服务端设备分别与客户端上位机以及一个或多个受控设备通过串口通信,服务端设备用于周期性发送脉冲触发一个或多个受控设备发送采集的数据,并在每个周期内对接收到的受控设备的数据进行汇总和计算后发送至客户端上位机,该方法包括:
服务端设备和各受控设备进行上电初始化和握手同步,其中上电初始化包括:配置系统滴答时钟的周期和每个串口对应的DMA通道,使每个串口的发送通道和接收通道分别与一个唯一的DMA通道的一个传输流绑定,为每个串口分别注册接收空闲中断,并创建环形队列用于保存每个周期对接收到的受控设备采集数据汇总处理后的计算结果,环形队列的队列元素至少包括包ID、组包时间戳、计算结果和各受控设备的采集数据有效标志位;
启动系统滴答时钟进行周期性计时,在每个计时周期的起点发送脉冲或触发中断通知各受控设备开始发送数据;
从各串口对应的DMA通道的传输流接收到受控设备发送的数据后进入对应的接收空闲中断处理函数,在中断处理函数中解析接收到的数据,并将解析后的数据保存在环形队列中;
在每个计时周期等待指定时间后,对接收到的各受控设备采集的数据汇总计算处理,将计算结果以DMA方式通过串口发送至客户端上位机。
通过上述技术方案,使用DMA和串口空闲中断提高了数据接收和处理的效率,减少了CPU的干预和处理延迟。通过周期性脉冲触发受控设备发送数据,确保数据采集的规律性和同步性。
可选地,在本发明提供的基于串口实现的多机通信数据处理方法中,受控设备上电初始化完成后向指定寄存器写入约定值;服务端设备上电初始化完成后循环读取指定寄存器,直至读出约定值,则服务端设备与该受控设备握手成功,当服务端设备分别与所有受控设备握手成功时即完成握手同步。
通过上述技术方案,上电初始化后通过寄存器进行握手,简化了通信初始化的复杂性,并避免了额外的握手协议。
可选地,在本发明提供的基于串口实现的多机通信数据处理方法中,根据系统滴答时钟频率设置系统滴答时钟的重装载值,使系统滴答时钟的每轮重装载周期时间与服务端所需的周期通知时间相等;将系统滴答时钟的计数器值清零并启动系统滴答时钟计时器,反复读取系统滴答时钟的状态寄存器,直到读出的系统滴答时钟的状态寄存器中重装载标志位COUNTFLAG的值为1时,将系统滴答时钟计数器计数值清零并分别向各受控设备发送脉冲触发GPIO中断以通知各受控设备发送数据,COUNTFLAG标志位在计数值递减至0时被硬件自动置1,COUNTFLAG标志位在被读取时被硬件自动清零。
根据上述技术方案,通过设置系统滴答时钟的重装载值,使其周期与服务端所需的通知周期时间相等,确保了精确的周期性触发,减少了时间偏差。系统滴答时钟计数器的自动清零和COUNTFLAG标志位的自动管理,简化了计时器的使用,并减少了软件干预,降低了出错的可能性。
可选地,在本发明提供的基于串口实现的多机通信数据处理方法中,队列元素的组包时间戳通过组包时读取的系统滴答时钟计数值和重装载次数计算得到,组包时间戳的计算方法为:
time_us = [loadCnt+(load+1-val)/(load+1)] * TRIG_PERIOD,其中,time_us为组包时间戳,TRIG_PERIOD为服务端的通知周期,loadCnt为组包时的重装载次数,load为系统滴答时钟的重装载计数值。
可选地,在本发明提供的基于串口实现的多机通信数据处理方法中,在服务端设备与各受控设备完成握手同步后,为各串口分别设置DMA接收缓冲区,开启DMA接收并指定接收首地址为DMA接收缓冲区首地址、指定接收长度为缓冲区长度;在串口接收空闲中断时,停止该串口DMA通道的传输流的接收,根据指定接收长度size和此次DMA流传输剩余的数据单元数HAL_DMA_GET_COUNTER,计算串口此次实际接收数据长度rxLen,所述rxLen=size-HAL_DMA_GET_COUNTER;按照与发送方预定的协议格式解析以DMA接收缓冲区首地址为起始的长度为rxLen的数据流,并将解析结果保存到全局变量中;再次开启DMA接收,重新配置DMA接收缓冲区的首地址和指定接收长度,以继续接收后续数据,指定接收长度大于预估从串口接收到的单包最大长度。
可选地,在本发明提供的基于串口实现的多机通信数据处理方法中,在串口接收空闲中断接收解析此次DMA接收缓冲区中收到的长度为实际接收数据长度的传输流时,如果检测到缓存包格式缺失、包长度缺失的错误,则放弃保存解析失败的数据并直接开启下一次DMA接收。
可选地,在本发明提供的基于串口实现的多机通信数据处理方法中,在本轮计时周期内等待指定时间,如果在指定时间内成功接收并解析所有受控设备发送的数据,则汇总各受控设备采集的数据并进行计算处理后生成新的队列元素插入环形队列,通过串口以DMA的方式将环形队列的队头元素发送到客户端上位机,队列元素包含包ID、组包时间戳、数据计算结果和受控设备采集数据的有效标志位;
如果在指定时间内未接收到所有受控设备采集的数据,则生成新的队列元素,并将其插入环形队列的队尾中,新的队列元素的各成员值与上一个队列元素相同,将未接收到数据的受控设备的采集数据有效标志位清零后更新包ID,通过串口以DMA的方式将环形队列的队头元素发送到客户端上位机;等待计时周期结束继续在下一轮计时周期内接收和处理数据。
可选地,在本发明提供的基于串口实现的多机通信数据处理方法中,在服务端通过触发GPIO中断,通知受控设备后立即读取系统滴答时钟并创建局部变量保存系统滴答时钟初始计数值和初始重装载次数;
反复读取系统滴答时钟当前计数值和当前重装载次数,直至计算出的当前时刻与通知时刻之间的时间间隔大于或等于等待指定时间,其中,等待指定时间为周期通知时间减去接收汇总并计算处理各串口采集数据所需的最大估计时间,当前时刻与通知时刻之间的时间间隔为:
dTime=[(val1-val2)/(load+1)+loadCnt2-loadCnt1]*TRIG_PERIOD,其中,load为重装载计数值,TRIG_PERIOD为服务端的通知周期,val1为系统滴答时钟初始计数值,val2为系统滴答时钟当前计数值,loadCnt1为初始重装载次数,loadCnt2为当前重装载次数。
可选地,在本发明提供的基于串口实现的多机通信数据处理方法中,环形队列为先进先出的数据结构,在写入队列时,队列元素插入到队尾位置序号所指示的队列空间中并更新队尾位置序号为WrId = (WrId +1) % MAX,在读取队列时,从队头位置序号所指示的队列元素开始读取并更新队头位置序号为RdId = (RdId +1) % MAX,其中,MAX为环形队列所能容纳的最大队列元素数量;
当主线程在本轮计时周期内等待指定时间仍未收到全部受控设备采集的数据时,则通过队尾位置序号找到上轮计时周期汇总计算保存的队列元素,在每轮计时周期内通过串口发送至客户端上位机的队列元素的包ID始终等于队头位置序号,以保证客户端上位机通过检查收到的包ID是否连续来检查传输过程中是否有丢包现象。
根据上述技术方案,环形队列的读写操作仅涉及位置序号的更新,无需复杂的操作,确保了数据处理的高效性。通过包ID的连续性检查,即使在数据接收不完全的情况下,也能通过保存的历史数据进行恢复,确保了数据传输的完整性,能够及时发现和处理丢包现象。
根据本发明的第二方面,提供了一种基于串口实现的多机通信系统,包括:客户端上位机、服务端设备、多个受控设备以及用于多机通信的UART接口;客户端上位机运行有用户交互界面程序,用于图形化展示汇总计算处理后的数据或信号;受控设备为嵌入式计算机或其它用于采集数据或信号的设备,受控设备具有串口,用于在收到服务端设备的通知后,实时采集数据并通过串口发送至服务端设备;服务端设备设置有多个串口,每个串口分别用于与客户端上位机或唯一的一个受控设备进行通信。
服务端设备运行有服务端软件,用于周期性发送脉冲触发一个或多个受控设备发送实时采集的数据,并在每个周期内对接收到的受控设备的数据进行汇总和计算后发送至客户端上位机,包括:
服务端设备和各受控设备进行上电初始化和握手同步,其中上电初始化包括:配置系统滴答时钟的周期和每个串口对应的DMA通道,使每个串口的发送通道和接收通道分别与一个唯一的DMA通道绑定,为每个串口分别注册接收空闲中断,并创建环形队列用于保存每个周期对接收到的受控设备采集数据汇总处理后的计算结果,环形队列的队列元素至少包括包ID、组包时间戳、计算结果和各受控设备的采集数据有效标志位;等待所有受控设备均上电初始化成功后握手完成;
启动系统滴答时钟进行周期性计时,在每个计时周期的起点发送脉冲或触发中断通知各受控设备开始发送数据;
从各串口对应的DMA通道接收到受控设备发送的数据后进入对应的接收空闲中断处理函数,在中断处理函数中解析接收到的数据,并将解析后的数据保存在环形队列中;
在每个计时周期等待指定时间后,对接收到的各受控设备采集的数据汇总计算处理,将计算结果以DMA方式通过串口发送至客户端上位机。
根据本发明的第三方面,提供一种服务端设备,包括:至少一个处理器;和存储有程序指令的存储器,其中,程序指令被配置为适于由至少一个处理器执行,程序指令包括用于执行本发明第一方面的基于串口实现的多机通信数据处理方法的指令。
根据本发明的第四方面,提供一种存储有程序指令的可读存储介质,当程序指令被服务端设备读取并执行时,使得服务端设备执行本发明第一方面的基于串口实现的多机通信数据处理方法。
根据本发明的基于串口实现的多机通信数据处理方法和多机通信系统至少可以达到以下有益效果:
(1)各串口的Tx、Rx通道分别与唯一的DMA通道的一个传输流绑定保证了各串口数据通道独立且提高了串口数据传输效率;
(2)分别为各串口注册接收空闲中断,在接收空闲中断处理函数中通过DMA通道传输流的剩余长度计算出DMA缓冲区中单次接收缓存的单包长度并完成解包后再次开启DMA接收,避开了接收粘包问题、提高了解包效率、减少了数据传输过程中的CPU占用时间;
(3)仅使用同一个系统滴答时钟SysTick的非中断计时方式的前提下,同时提供了触发中断以通知受控设备的准确计时周期产生方法、计时周期内等待收包的固定的超时指定时间的产生方法以及组包发送时的精准时间戳生成方法,保证了汇总接收的采集数据的实时性和周期性;
(4)将环形队列的队头位置ID作为包ID,超时未收到全部采集数据时从环形队列中能迅速找到最近发送的上一包并将数据有效标志位清零后给客户端上位机,保证了客户端上位机图像化显示的连续性、方便了客户端迅速识别出丢包和未收到采集数据的错误。
因此,本方案能够周期性通知受控设备采集数据或信号、实时接收多个受控设备由串口发送的数据并快速准确地汇总计算处理后发送给客户端上位机,解决了使用串口进行多机通信的性能问题。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了根据本发明一个实施例的基于串口实现的多机通信系统的结构示意图;
图2示出了根据本发明一个实施例的服务端设备软件架构示意图;
图3示出了根据本发明一个实施例的服务端设备主线程的代码实现示例;
图4示出了根据本发明一个实施例的服务端设备100的结构示意图;
图5示出了根据本发明一个实施例的基于串口实现的多机通信数据处理方法500的流程示意图;
图6示出了根据本发明一个实施例的系统滴答时钟非中断计时及生成时间戳的代码实现示例;
图7示出了根据本发明一个实施例的串口接收空闲中断处理函数代码示例。
具体实施方式
多机通信是通信网络、航空航天、测控、工业自动化等各领域的常见需求,其中,客户端/服务端架构又是最常见的多机通信架构之一。例如,对于测控领域,使用嵌入式下位机作为通信服务端,将其它用于实时采集总线数据的嵌入式设备作为受控设备,受控设备在收到服务端设备的通知信号时,通过串口将实时采集到的数据传输给通信服务端,通信服务端在汇总计算处理各受控设备采集的数据后,通过串口发送给客户端上位机以界面显示给用户;对于工业自动化和航空航天领域,服务端周期性接收汇总由各嵌入式设备或传感器通过串口发送的温度、湿度、方向加速度等信息,并计算处理为平均温度、平均湿度、合成加速度等信息后通过串口发送至客户端上位机。由于串行接口的成本低、布线难度低、短距离传输延迟小等优点,使用多个串口即UART进行多机通信,仍然是嵌入式和通信领域的较优选择。
然而,如何使用串口更快速地接收、汇总和计算处理多机通信数据,提高通知各受控设备发送采集数据或信号的实时性和周期性,保证串口通信接收方在解析传输流时能够解决传输流的粘包问题以提高解包效率,在串口通信传输误码或丢包的情况下迅速识别出传输错误,仍然是嵌入式和通信领域需要解决的通信性能问题。
本方案为了提高使用串口进行多机通信的性能问题,提出了一种基于串口实现的多机通信数据处理方法,能够周期性准确通知受控设备采集数据,实时接收多个受控设备由串口发送的数据并快速汇总计算处理后发送给客户端上位机。
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了根据本发明一个实施例的基于串口实现的多机通信系统的结构示意图。如图1所示,该系统包括客户端上位机、服务端设备、多个受控设备(受控设备1、受控设备2......受控设备n)以及用于多机通信的UART接口(UART0、UART1、UART2......UARTn)。其中,客户端上位机运行有用户交互界面程序,用于图形化展示汇总计算处理后的数据或信号。服务端设备设置有多个串口,每个串口分别用于与客户端上位机或唯一的一个受控设备进行通信。受控设备为嵌入式计算机或其它用于采集数据或信号的设备。参照图1所示,服务端设备与客户端上位机通过串口UART0通信连接,与受控设备1、受控设备2......受控设备n分别通过串口UART1、UART2......UARTn通信连接。
服务端设备运行有服务端软件,用于周期性发送脉冲触发一个或多个受控设备发送实时采集的数据,并在每个周期内对接收到的受控设备的数据进行汇总和计算后发送至客户端上位机。受控设备在收到服务端设备的通知后,实时采集数据或信号并通过对应的串口发送至服务端设备。
图2示出了根据本发明一个实施例的服务端设备软件架构示意图。如图2所示,在主线程中,1)服务端设备和各受控设备进行上电初始化和握手同步,其中上电初始化包括:配置系统滴答时钟的周期和每个串口对应的DMA通道的一个传输流,使每个串口的发送通道和接收通道分别与一个唯一的DMA通道的传输流绑定,为每个串口分别注册接收空闲中断,并创建环形队列用于保存每个周期对接收到的受控设备采集数据汇总处理后的计算结果,等待所有受控设备均上电初始化成功后握手完成。其中,环形队列的队列元素至少包括包ID、组包时间戳、计算结果和各受控设备的采集数据有效标志位;
2)启动系统滴答时钟进行周期性计时,在每个计时周期的起点发送脉冲1和脉冲2分别通知受控设备A和受控设备B开始发送实时采集的数据;
3)主线程在每个计时周期内等待指定时间,期间自动从各串口对应的DMA通道接收到受控设备发送的数据后,进入对应的接收空闲中断处理函数,在接收空闲中断处理函数中先暂时关闭DMA接收,然后解析保存DMA接收缓冲区中的数据,然后再重新开启DMA接收并指定接收长度为缓冲区长度,为保证每次进入空闲中断时缓存的都是一整包数据,指定的接收长度应该远大于预计接收的单包最大长度;
4)在每个计时周期等待指定时间后,检查是否收到了各受控设备的采集数据:若全部受控设备的采集数据均已收到则汇总计算处理后,生成新的队列元素插入环形队列,然后将队列元素通过串口以DMA方式发送给客户端上位机;反之若超时未收到全部受控设备的采集数据,则将环形队列中的上一包队列元素通过串口以DMA方式发送给客户端上位机;
5)回到步骤3),开始下一个计时周期的通知受控设备发送采集数据并接收汇总处理的过程。
图3示出了根据本发明一个实施例的服务端设备主线程的代码实现示例。如图3所示,Acc1A、Acc1B、Acc1C分别是三个不同的受控设备,它们分别通过串口Uart5、Uart3、Uart2与服务端设备进行通信。
主线程上电时先进行串口、DMA、系统滴答时钟SysTick以及其它硬件的初始化,在初始化各串口时会分别为各串口注册一个串口接收空闲中断(IDEL interrupt),并将各串口的Tx、Rx分别与唯一的一个DMA的传输流进行绑定。
初始化结束后与Acc1A、Acc1B、Acc1C分别进行上电握手同步,等到受控设备均上电初始化完成时握手结束。握手结束后开启各串口的接收空闲中断,并调用函数指定各串口的DMA接收缓冲区开始首次DMA接收,此时指定的DMA接收长度为缓冲区长度,该长度应该远大于可能收到的单包最大长度,以保证接收缓冲区中不出现缓存到断包的现象。
然后开启系统嘀嗒计时器,在并示例中按照1us的触发通知计时周期并根据系统滴答时钟频率设置了系统嘀嗒计时器的重载值,图4中的TRIGPERIOD_ACC1_US为代表触发周期的宏值,开启嘀嗒计时器后会向下递减计数,当计数值减至0时会自动重装载所设定的重载值且硬件会自动将SysTick的状态寄存器的COUNTFLAG标志位置1。
图3中的函数WaitSysTimerEnd()本质上就是在循环等待读取SysTick的状态寄存器读到的COUNTFLGA标志位由0变为1,此时代表本轮计时周期结束,下一轮计时周期开始。由于COUNTFLGA在被读取时会被硬件自动清零,故只要读到该标志位为1,就一定代表嘀嗒计时器又重装载了一次即结束了一个计时周期(1us)。
主线程在每个计时周期的起点分别向受控设备Acc1A、Acc1B、Acc1C发送脉冲,通知各受控设备实时采集并发送数据。此时收到任何受控设备发送的采集数据,CPU都会进入对应串口的接收空闲中断中收包并解析。主线程在发送脉冲通知后会等待指定时间,当超过指定时间时再调用函数MakeGuiPkt()汇总计算各受控设备采集的数据生成新的环形队列元素,并在该函数中通过串口以DMA方式发送将该队列元素给客户端上位机。
值得注意的是,若超过指定时间没有收到全部受控设备发送的数据,会直接将环形队列中缓存的上个队列元素复制后并插入队尾并发送给上位机,发送前会修改其时间戳和包ID。时间戳也在MakeGuiPkt函数中获取,包ID等于发送的队列元素所处的环形队列的队头位置ID。然后主线程回到WaitSysTimerEnd()函数处等待下一轮计时周期开始。
图4示出了根据本发明一个实施例的服务端设备100的结构示意图。如图4所示,在基本配置102中,服务端设备100典型地包括存储器106和一个或者多个处理器104。存储器总线108可以用于在处理器104和存储器106之间的通信。
取决于期望的配置,处理器104可以是任何类型的处理器,包括但不限于:微处理器(µP)、微控制器(µC)、数字信息处理器(DSP)或者它们的任何组合。处理器104可以包括诸如一级高速缓存110和二级高速缓存112之类的一个或者多个级别的高速缓存、处理器核心114和寄存器116。示例的处理器核心114可以包括运算逻辑单元(ALU)、浮点数单元(FPU)、数字信号处理核心(DSP核心)或者它们的任何组合。示例的存储器控制器118可以与处理器104一起使用,或者在一些实现中,存储器控制器118可以是处理器104的一个内部部分。
取决于期望的配置,存储器106可以是任意类型的存储器,包括但不限于:易失性存储器(诸如RAM)、非易失性存储器(诸如ROM、闪存等)或者它们的任何组合。服务端设备中的物理内存通常指的是易失性存储器RAM,磁盘中的数据需要加载至物理内存中才能够被处理器104读取。存储器106可以包括操作系统120、一个或者多个程序122以及程序数据124。在一些实施方式中,程序122可以布置为在操作系统上由一个或多个处理器104利用程序数据124执行指令。操作系统120例如可以是Linux、Windows等,其包括用于处理基本系统服务以及执行依赖于硬件的任务的程序指令。程序122包括用于实现各种用户期望的功能的程序指令,程序122例如可以是浏览器、即时通讯软件、软件开发工具(例如集成开发环境IDE、编译器等)等,但不限于此。当程序122被安装到服务端设备100中时,可以向操作系统120添加驱动模块。
在服务端设备100启动运行时,处理器104会从存储器106中读取操作系统120的程序指令并执行。程序122运行在操作系统120之上,利用操作系统120以及底层硬件提供的接口来实现各种用户期望的功能。当用户启动程序122时,程序122会加载至存储器106中,处理器104从存储器106中读取并执行程序122的程序指令。
服务端设备100还包括储存设备132,储存设备132包括可移除储存器136和不可移除储存器138,可移除储存器136和不可移除储存器138均与储存接口总线134连接。
服务端设备100还可以包括有助于从各种接口设备(例如,输出设备142、外设接口144和通信设备146)到基本配置102经由总线/接口控制器130的通信的接口总线140。示例的输出设备142包括图形处理单元148和音频处理单元150。它们可以被配置为有助于经由一个或者多个A/V端口152与诸如显示器或者扬声器之类的各种外部设备进行通信。示例外设接口144可以包括串行接口控制器154和并行接口控制器156,它们可以被配置为有助于经由一个或者多个I/O端口158和诸如输入设备(例如,键盘、鼠标、笔、语音输入设备、触摸输入设备)或者其他外设(例如打印机、扫描仪等)之类的外部设备进行通信。示例的通信设备146可以包括网络控制器160,其可以被布置为便于经由一个或者多个通信端口164与一个或者多个其他计算设备162通过网络通信链路的通信。
网络通信链路可以是通信介质的一个示例。通信介质通常可以体现为在诸如载波或者其他传输机制之类的调制数据信号中的计算机可读指令、数据结构、程序模块,并且可以包括任何信息递送介质。“调制数据信号”可以这样的信号,它的数据集中的一个或者多个或者它的改变可以在信号中编码信息的方式进行。作为非限制性的示例,通信介质可以包括诸如有线网络或者专线网络之类的有线介质,以及诸如声音、射频(RF)、微波、红外(IR)或者其它无线介质在内的各种无线介质。这里使用的术语计算机可读介质可以包括存储介质和通信介质二者。
服务端设备100还包括与接口控制器130相连的储存接口总线134。储存接口总线134与储存设备132相连,储存设备132适于进行数据存储。示例的储存设备132可以包括可移除储存器136(例如CD、DVD、U盘、可移动硬盘等)和不可移除储存器138(例如硬盘驱动器HDD等)。
在根据本发明的服务端设备100中,程序122包括用于执行本发明的基于串口实现的多机通信数据处理方法500的指令。
图5示出了根据本发明一个实施例的基于串口实现的多机通信数据处理方法500的流程示意图。如图5所示,首先在步骤S510中,服务端设备和各受控设备进行上电初始化和握手同步,其中上电初始化包括:配置系统滴答时钟的周期和每个串口对应的DMA通道,使每个串口的发送通道和接收通道分别与一个唯一的DMA通道绑定,为每个串口分别注册接收空闲中断,并创建环形队列用于保存每个周期对接收到的受控设备采集数据汇总处理后的计算结果,环形队列的队列元素至少包括包ID、组包时间戳、计算结果和各受控设备的采集数据有效标志位。
设定系统滴答时钟SysTick可以为系统获取稳定的时间基准,以同步数据传输和处理周期,同时提供了触发中断以通知受控设备产生准确的计时周期,保证了接收采集数据的周期性。
上电初始化过程中为每个串口分别注册了唯一的接收空闲中断,并申请了多个DMA通道,将各串口的TX和RX通道分别与唯一的一个DMA通道的传输流绑定,即,将不同的串口传输流分配到不同的DMA通道,可以使各串口数据通道独立,将数据传输从CPU处理转移到DMA(直接内存访问)控制器,避免一个串口的数据传输影响到其他串口的传输流,仅使用DMA发送或接收串口数据提高数据收发效率且减少了CPU占用时间,仅在DMA接收完一整包数据后才会进入接收空闲中断处理函数,减少了数据收发过程的中断次数。
环形队列用于存储每个周期的数据计算结果,以便系统能在固定时间间隔内处理数据并保持数据的有序性。其中,环形队列的队列元素至少包括:包ID:唯一标识数据包的队头位置ID,方便追踪和管理数据;组包时间戳:记录数据包被处理的时间,以便进行时间分析或同步;计算结果:包含对受控设备采集数据的汇总和计算结果;有效标志位:指示数据的有效性,确保处理的数据符合预期。
随后在步骤S520中,启动系统滴答时钟进行周期性计时,在每个计时周期的起点发送脉冲或触发中断通知各受控设备开始发送数据。
服务端在上电初始化及握手完成后可以根据系统滴答时钟频率设置系统滴答时钟的重装载值,使系统滴答时钟的每轮重装载周期时间与服务端所需的周期通知时间相等。可以根据需要的计时精度设置SysTick的重载值。这个重载值决定了计时周期的长度。例如,如果需要每 1 毫秒产生一次中断,设置重载值为系统滴答时钟频率除以 1 毫秒。
如果选择通过发送脉冲通知受控设备,可以使用 GPIO 输出引脚在每个 SysTick计时周期的起点生成一个脉冲信号。受控设备可以监听这个脉冲信号,并在接收到脉冲时开始发送数据。
如果选择通过触发中断通知受控设备,SysTick 的中断服务程序(ISR)会在每个计时周期的起点触发中断。中断服务程序可以通过串口或其他通信方式向受控设备发送指令或数据,告知其开始数据发送。在接收到 SysTick 产生的脉冲或指令后,受控设备开始发送数据。服务端需要配置相应的接收机制来处理从受控设备发送过来的数据。
在本发明的一个实施例中,将系统滴答时钟的计数器值清零并启动系统滴答时钟计时器,反复读取系统滴答时钟的状态寄存器,直到读出的系统滴答时钟的状态寄存器中重装载标志位COUNTFLAG的值为1时,将系统滴答时钟计数器计数值清零并分别向各受控设备发送脉冲触发GPIO中断以通知各受控设备发送数据,COUNTFLAG标志位在计数值递减至0时被硬件自动置1,COUNTFLAG标志位在被读取时被硬件自动清零。
通过使用 SysTick 定时器来同步受控设备,确保每个设备在精确的时间点开始数据发送,从而实现数据的有效采集和处理。这种方法能够提高系统的同步精度,并确保数据传输的时效性。
图6示出了根据本发明一个实施例的系统滴答时钟非中断计时及生成时间戳的代码实现示例。如图6所示,SysTimer_Start函数根据传入的通知计时周期us(该变量以微秒为单位)和系统的时钟频率去计算并设置系统滴答时钟SysTick的重装载值,以保证每一次SysTick计数减至0重装载的这个周期时间恰好为设置值us。
WaitSysTimerEnd()函数用于等待该通知计时周期结束,该函数通过查询SysTick的状态寄存器中的COUNTFLAG标志位是否为1来实现,在此示例中,SysTick->CTRL的第0位和第16位分别代表系统嘀嗒计时的启动位和COUNTFLAG标志,其中COUNTFLAG被读取后会被硬件自动清零。
函数GetTicksNow和Calc_dSysTimeToNow_us的具体代码实现示例,参照图3所示通过在等待起点时刻调用函数GetTicksNow(&stTime),在循环等待时使用代码while(Calc_dSysTimeToNow_us(&stTime)<WAIT_ACC1TX_US){ },即可实现使用与通知计时的同一SysTick以非中断方式生成指定等待时间,此处不采用中断计时方式是有意为之,因为各串口发送数据的接收都是以DMA方式在空闲中断中接收的,主线程确实需要以查询方式等待指定时间。图6所示函数GetTime_us即提供了如何使用SysTick生成当前时刻的时间戳的方法,此示例函数生成的时间戳以us为单位。
环形队列元素的组包时间戳通过组包时读取的系统滴答时钟计数值和重装载次数计算得到,即,组包时间戳time_us的计算方法为:
time_us = [loadCnt+(load+1-val)/(load+1)] * TRIG_PERIOD,其中TRIG_PERIOD为服务端的通知周期,loadCnt为组包时的重装载次数,load为系统滴答时钟的重装载计数值。
因此,本方案在仅使用同一个系统滴答时钟SysTick非中断计时方式的前提下,提供了触发中断以通知受控设备产生准确的计时周期,能够在组包发送时生成精准的时间戳,保证了汇总接收的采集数据的实时性和周期性。
接着在步骤S530中,从各串口对应的DMA通道的传输流接收到受控设备发送的数据后进入对应的接收空闲中断处理函数,在中断处理函数中解析接收到的数据,并将解析后的数据保存在环形队列中。
具体地,在服务端设备与各受控设备完成握手同步后,为各串口分别设置DMA接收缓冲区,开启DMA接收并指定接收首地址为DMA接收缓冲区首地址、指定接收长度为缓冲区长度size。
在串口接收空闲中断时,停止该串口DMA通道的接收,根据缓冲区剩余长度和缓冲区总长度,计算实际接收数据长度。即,当服务端进入串口接收空闲中断处理函数时,先立即停止该串口的DMA通道的接收,然后根据该DMA通道的接收传输流的剩余长度remain和指定接收长度size计算出此次实际通过串口接收的数据量rxLen = size - remain。
将DMA接收缓冲区中长度为实际接收数据长度的传输流按照预定格式解析,并保存到全局变量中。可以按照与受控设备约定的数据格式从左往右将DMA接收缓冲区中长度为rxLen的传输流解析成采集到的数据并保存至全局变量中。
再次开启DMA接收,重新配置DMA接收缓冲区的首地址和指定接收长度,以继续接收后续数据,指定接收长度大于从串口接收到的单包最大长度。更进一步地说,指定的接收长度应远大于预计接收的单包最大长度。
在本发明的一个实施例中,在串口接收空闲中断接收解析此次DMA接收缓冲区中收到的长度为实际接收数据长度的传输流时,如果检测到缓存包格式缺失、包长度缺失的错误,则放弃保存解析失败的数据并直接开启下一次DMA接收。这样可以有效处理接收到的数据包格式和长度错误,并确保系统能够持续接收有效的数据。
通过DMA通道传输流的剩余长度计算出DMA缓冲区中单次接收缓存的单包长度,在完成解包后再次开启DMA接收,既避开了接收粘包问题,提高了解包效率,又减少了数据传输过程中的CPU占用时间。
图7示出了根据本发明一个实施例的串口接收空闲中断处理函数代码示例。如图7所示,HAL_UARTEx_RxEventCallback为串口接收空闲中断处理函数,图7中的devNO为受控设备的编号,每个受控设备分别创建了一个信息句柄gszhDev[devNO]。当服务端进入串口接收空闲中断处理函数时,先立即停止该串口的DMA通道的接收,然后根据该DMA通道的接收传输流的剩余长度remain和指定接收长度size计算出此次实际通过串口接收的数据量rxLen = size - remain,按照与受控设备约定的数据格式从左往右将DMA接收缓冲区中长度为rxLen的传输流解析成采集到的数据并保存至全局变量中,然后再次开启DMA接收并指定接收首地址为DMA接收缓冲区首地址、指定接收长度为缓冲区长度size,其中指定接收长度size应远大于可能从串口收到的单包最大长度”。
若指定接收长度size足够大,理论上本轮DMA不可能收到长为size的全部数据,就会进入串口接收空闲中断停止DMA接收,并在解包后开启下一轮DMA接收,故而理论上即使不实现DMA接收完成中断也不影响本发明的实施,但为了防止预先设置的size不够大的情况,还是对此回调函数做了实现。
最后执行步骤S540,在每个计时周期等待指定时间,对接收到的各受控设备采集的数据汇总计算处理,将计算结果以DMA方式通过串口发送至客户端上位机。
其中,服务端在计时周期内等待的指定时间为通知周期时间减去接收汇总并计算处理各串口采集数据所需的最大估计时间,即,等待的指定时间小于通知周期。
在本轮计时周期内等待指定时间,具体包括:在服务端通过触发GPIO中断通知受控设备后立即读取SysTick并创建局部变量保存SysTick的嘀嗒计数值val1和SysTick的重装载次数loadCnt1,然后反复读取当前时刻SysTick的嘀嗒计数值val2和SysTick的重装载次数loadCnt2直至计算出当前时刻与通知时刻之间的时间间隔dTime大于等于等待的指定时间。其中,等待指定时间为周期通知时间减去接收汇总并计算处理各串口采集数据所需的最大估计时间。当前时刻与通知时刻之间的时间间隔dTime为:
dTime=[(val1-val2)/(load+1)+loadCnt2-loadCnt1]*TRIG_PERIOD,其中,load为重装载计数值,TRIG_PERIOD为服务端的通知周期,val1为系统滴答时钟初始计数值,val2为系统滴答时钟当前计数值,loadCnt1为初始重装载次数,loadCnt2为当前重装载次数。
环形队列为先进先出的数据结构,在写入队列时,队列元素插入到队尾位置序号所指示的队列空间中并更新队尾位置序号为WrId = (WrId +1) % MAX,在读取队列时,从队头位置序号所指示的队列元素开始读取并更新队头位置序号为RdId = (RdId +1) %MAX,其中,MAX为环形队列所能容纳的最大队列元素数量;
当主线程在本轮计时周期内等待指定时间仍未收到全部受控设备采集的数据时,则通过队尾位置序号找到上轮计时周期汇总计算保存的队列元素,在每轮计时周期内通过串口发送至客户端上位机的队列元素的包ID始终等于队头位置序号RdId,以保证客户端上位机通过检查收到的包ID是否连续来检查传输过程中是否有丢包现象。
通过使用环形队列缓存计算结果,并将队头位置ID作为发送的包ID,在超时未收到全部采集数据时,能迅速找到最近发送的上一个数据包,将数据有效标志位清零后发送给客户端上位机,既保证了客户端上位机图像化显示的连续性,又方便了客户端上位机能迅速识别出传输丢包、未收到某受控设备的采集数据等错误。
综上所述,本发明提供的基于串口实现的多机通信数据处理方法和多机通信系统至少可以达到以下有益效果:
(1)各串口的Tx、Rx通道分别与唯一的DMA通道的一个传输流绑定保证了各串口数据通道独立且提高了串口数据传输效率;
(2)分别为各串口注册接收空闲中断,在接收空闲中断处理函数中通过DMA通道传输流的剩余长度计算出DMA缓冲区中单次接收缓存的单包长度并完成解包后再次开启DMA接收,避开了接收粘包问题、提高了解包效率、减少了数据传输过程中的CPU占用时间;
(3)仅使用同一个系统滴答时钟SysTick的非中断计时方式的前提下,同时提供了触发中断以通知受控设备的准确计时周期产生方法、计时周期内等待收包的固定的超时指定时间的产生方法以及组包发送时的精准时间戳生成方法,保证了汇总接收的采集数据的实时性和周期性;
(4)将环形队列的队头位置ID作为包ID,超时未收到全部采集数据时从环形队列中能迅速找到最近发送的上一包并将数据有效标志位清零后给客户端上位机,保证了客户端上位机图像化显示的连续性、方便了客户端迅速识别出丢包和未收到采集数据的错误。
因此,本方案能够周期性通知受控设备采集数据或信号、实时接收多个受控设备由串口发送的数据并快速准确地汇总计算处理后发送给客户端上位机,解决了使用串口进行多机通信的性能问题。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组件可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
此外,实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的而非限制性的,本发明的范围由所附权利要求书限定。
Claims (10)
1.一种基于串口实现的多机通信数据处理方法,基于服务端设备实现,所述服务端设备分别与客户端上位机以及一个或多个受控设备通过串口通信,所述服务端设备用于周期性发送脉冲触发所述一个或多个受控设备发送采集的数据,并在每个周期内对接收到的受控设备的数据进行汇总和计算后发送至所述客户端上位机,其特征在于,所述方法包括:
服务端设备和各受控设备进行上电初始化和握手同步,其中上电初始化包括:配置系统滴答时钟的周期和每个串口对应的DMA通道,使每个串口的发送通道和接收通道分别与一个唯一的DMA通道的一个传输流绑定,为每个串口分别注册接收空闲中断,并创建环形队列用于保存每个周期对接收到的受控设备采集数据汇总处理后的计算结果,所述环形队列的队列元素至少包括包ID、组包时间戳、计算结果和各受控设备的采集数据有效标志位;
启动所述系统滴答时钟进行周期性计时,在每个计时周期的起点发送所述脉冲或触发中断通知各受控设备开始发送数据;
从各串口对应的DMA通道的传输流接收到受控设备发送的数据后进入对应的接收空闲中断处理函数,在所述中断处理函数中解析接收到的数据,并将解析后的数据保存在所述环形队列中;
在每个计时周期等待指定时间后,对接收到的各受控设备采集的数据汇总计算处理,将计算结果以DMA方式通过串口发送至客户端上位机。
2.根据权利要求1所述的基于串口实现的多机通信数据处理方法,其特征在于,所述握手同步的步骤包括:
受控设备上电初始化完成后向指定寄存器写入约定值;
服务端设备上电初始化完成后循环读取所述指定寄存器,直至读出所述约定值,则服务端设备与该受控设备握手成功,当服务端设备分别与所有受控设备握手成功时即完成握手同步。
3.根据权利要求1所述的基于串口实现的多机通信数据处理方法,其特征在于,所述启动所述系统滴答时钟进行周期性计时,在每个计时周期的起点发送所述脉冲或触发中断通知各受控设备开始发送数据的步骤包括:
根据系统滴答时钟频率设置系统滴答时钟的重装载值,使系统滴答时钟的每轮重装载周期时间与服务端所需的周期通知时间相等;
将系统滴答时钟的计数器值清零并启动系统滴答时钟计时器,反复读取系统滴答时钟的状态寄存器,直到读出的系统滴答时钟的状态寄存器中重装载标志位COUNTFLAG的值为1时,将系统滴答时钟计数器计数值清零并分别向各受控设备发送脉冲触发GPIO中断以通知各受控设备发送数据,所述COUNTFLAG标志位在计数值递减至0时被硬件自动置1,COUNTFLAG标志位在被读取时被硬件自动清零。
4.根据权利要求3所述的基于串口实现的多机通信数据处理方法,其特征在于,所述队列元素的组包时间戳通过组包时读取的系统滴答时钟计数值和重装载次数计算得到,所述组包时间戳的计算方法为:
time_us = [loadCnt+(load+1-val)/(load+1)] * TRIG_PERIOD,其中,time_us为组包时间戳,TRIG_PERIOD为服务端的通知周期,loadCnt为组包时的重装载次数,load为系统滴答时钟的重装载计数值。
5.根据权利要求1所述的基于串口实现的多机通信数据处理方法,其特征在于,所述在所述中断处理函数中解析接收到的数据,并将解析后的数据保存在所述环形队列中的步骤包括:
在服务端设备与各受控设备完成握手同步后,为各串口分别设置DMA接收缓冲区,开启DMA接收并指定接收首地址为DMA接收缓冲区首地址、指定接收长度为缓冲区长度;
在串口接收空闲中断时,停止该串口DMA通道的传输流的接收,根据指定接收长度size和此次DMA流传输剩余的数据单元数HAL_DMA_GET_COUNTER,计算串口此次实际接收数据长度rxLen,所述rxLen=size-HAL_DMA_GET_COUNTER;
按照与发送方预定的协议格式解析以DMA接收缓冲区首地址为起始的长度为rxLen的数据流,并将解析结果保存到全局变量中;
再次开启DMA接收,重新配置DMA接收缓冲区的首地址和指定接收长度,以继续接收后续数据,所述指定接收长度大于预估从串口接收到的单包最大长度。
6.根据权利要求5所述的基于串口实现的多机通信数据处理方法,其特征在于,在所述串口接收空闲中断接收解析此次DMA接收缓冲区中收到的长度为实际接收数据长度的传输流时,如果检测到缓存包格式缺失、包长度缺失的错误,则放弃保存解析失败的数据并直接开启下一次DMA接收。
7.根据权利要求1所述的基于串口实现的多机通信数据处理方法,其特征在于,所述在每个计时周期等待指定时间,对接收到的各受控设备采集的数据汇总计算处理,将计算结果以DMA方式通过串口发送至客户端上位机的步骤包括:
在本轮计时周期内等待指定时间,如果在指定时间内成功接收并解析所有受控设备发送的数据,则汇总各受控设备采集的数据并进行计算处理后生成新的队列元素插入所述环形队列,以DMA的方式通过串口将环形队列的队头元素发送到客户端上位机,所述队列元素包含包ID、组包时间戳、数据计算结果和受控设备采集数据的有效标志位;
如果在指定时间内未接收到所有受控设备采集的数据,则生成新的队列元素,并将其插入环形队列的队尾中,新的队列元素的各成员值与上一个队列元素相同,将未接收到数据的受控设备的采集数据有效标志位清零后更新包ID,以DMA的方式通过串口将环形队列的队头元素发送到客户端上位机;
等待计时周期结束继续在下一轮计时周期内接收和处理数据。
8.根据权利要求7所述的基于串口实现的多机通信数据处理方法,其特征在于,所述在每个计时周期等待指定时间的步骤包括:
在服务端通过触发GPIO中断,通知受控设备后立即读取系统滴答时钟并创建局部变量保存系统滴答时钟初始计数值和初始重装载次数;
反复读取系统滴答时钟当前计数值和当前重装载次数,直至计算出的当前时刻与通知时刻之间的时间间隔大于或等于所述等待指定时间,其中,所述等待指定时间为周期通知时间减去接收汇总并计算处理各串口采集数据所需的最大估计时间,所述当前时刻与通知时刻之间的时间间隔为:
dTime=[(val1-val2)/(load+1)+ loadCnt2-loadCnt1] * TRIG_PERIOD,其中,load为重装载计数值,TRIG_PERIOD为服务端的通知周期,val1为系统滴答时钟初始计数值,val2为系统滴答时钟当前计数值,loadCnt1为初始重装载次数,loadCnt2为当前重装载次数。
9.根据权利要求1所述的基于串口实现的多机通信数据处理方法,其特征在于,所述环形队列为先进先出的数据结构,在写入队列时,队列元素插入到队尾位置序号所指示的队列空间中并更新队尾位置序号为WrId = (WrId +1) % MAX,在读取队列时,从队头位置序号所指示的队列元素开始读取并更新队头位置序号为RdId = (RdId +1) % MAX,其中,所述MAX为环形队列所能容纳的最大队列元素数量;
当主线程在本轮计时周期内等待指定时间仍未收到全部受控设备采集的数据时,则通过所述队尾位置序号找到上轮计时周期汇总计算保存的队列元素,在每轮计时周期内通过串口发送至客户端上位机的队列元素的包ID始终等于队头位置序号。
10.一种基于串口实现的多机通信系统,其特征在于,包括:客户端上位机、服务端设备、多个受控设备以及用于多机通信的UART接口;
所述客户端上位机运行有用户交互界面程序,用于图形化展示汇总计算处理后的数据或信号;
所述受控设备为嵌入式计算机或用于采集数据或信号的设备,所述受控设备具有串口,用于在收到服务端设备的通知后,实时采集数据并通过串口发送至服务端设备;
所述服务端设备设置有多个串口,每个串口分别用于与客户端上位机或唯一的一个受控设备进行通信,所述服务端设备运行有服务端软件,用于周期性发送脉冲触发一个或多个受控设备发送实时采集的数据,并在每个周期内对接收到的受控设备的数据进行汇总和计算后发送至所述客户端上位机,具体包括:
服务端设备和各受控设备进行上电初始化和握手同步,其中上电初始化包括:配置系统滴答时钟的周期和每个串口对应的DMA通道,使每个串口的发送通道和接收通道分别与一个唯一的DMA通道绑定,为每个串口分别注册接收空闲中断,并创建环形队列用于保存每个周期对接收到的受控设备采集数据汇总处理后的计算结果,所述环形队列的队列元素至少包括包ID、组包时间戳、计算结果和各受控设备的采集数据有效标志位;等待所有受控设备均上电初始化成功后握手完成;
启动所述系统滴答时钟进行周期性计时,在每个计时周期的起点发送所述脉冲或触发中断通知各受控设备开始发送数据;
从各串口对应的DMA通道接收到受控设备发送的数据后进入对应的接收空闲中断处理函数,在所述中断处理函数中解析接收到的数据,并将解析后的数据保存在所述环形队列中;
在每个计时周期等待指定时间后,对接收到的各受控设备采集的数据汇总计算处理,将计算结果以DMA方式通过串口发送至客户端上位机。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202411689494.9A CN119201805A (zh) | 2024-11-25 | 2024-11-25 | 基于串口实现的多机通信数据处理方法和多机通信系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202411689494.9A CN119201805A (zh) | 2024-11-25 | 2024-11-25 | 基于串口实现的多机通信数据处理方法和多机通信系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN119201805A true CN119201805A (zh) | 2024-12-27 |
Family
ID=94042352
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202411689494.9A Pending CN119201805A (zh) | 2024-11-25 | 2024-11-25 | 基于串口实现的多机通信数据处理方法和多机通信系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN119201805A (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2074633A1 (en) * | 1991-09-03 | 1993-03-04 | Robert G. Baker | Real-time, concurrent, multifunction digital signal processor subsystem for personal computers |
WO2007028942A1 (en) * | 2005-09-09 | 2007-03-15 | The University Of Leicester | Time-triggered co-operative hardware scheduler |
CN101018179A (zh) * | 2007-03-07 | 2007-08-15 | 今创集团有限公司 | 数据总线桥接器及其工作方法 |
CN106155960A (zh) * | 2016-06-29 | 2016-11-23 | 广州慧睿思通信息科技有限公司 | 基于gpio握手和edma的uart串口通信方法 |
CN116847007A (zh) * | 2023-06-30 | 2023-10-03 | 天津津航计算技术研究所 | 多通道hdlc控制系统及其数据上传方法、数据下发方法 |
-
2024
- 2024-11-25 CN CN202411689494.9A patent/CN119201805A/zh active Pending
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2074633A1 (en) * | 1991-09-03 | 1993-03-04 | Robert G. Baker | Real-time, concurrent, multifunction digital signal processor subsystem for personal computers |
WO2007028942A1 (en) * | 2005-09-09 | 2007-03-15 | The University Of Leicester | Time-triggered co-operative hardware scheduler |
CN101018179A (zh) * | 2007-03-07 | 2007-08-15 | 今创集团有限公司 | 数据总线桥接器及其工作方法 |
CN106155960A (zh) * | 2016-06-29 | 2016-11-23 | 广州慧睿思通信息科技有限公司 | 基于gpio握手和edma的uart串口通信方法 |
CN116847007A (zh) * | 2023-06-30 | 2023-10-03 | 天津津航计算技术研究所 | 多通道hdlc控制系统及其数据上传方法、数据下发方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR101281354B1 (ko) | 유니버설 시리얼 버스 (usb) 원격 웨이크업 | |
CN107092568B (zh) | 在低功耗系统中处理数据的数据通信接口 | |
EP2999276B1 (en) | Method and terminal for reporting sensor data | |
CN101420308B (zh) | 在活动状态功率管理过程中改善延时的方法和系统 | |
US7490255B2 (en) | Power efficient flow control model for USB asynchronous transfers | |
US8549204B2 (en) | Method and apparatus for scheduling transactions in a multi-speed bus environment | |
CN110213143A (zh) | 一种1553b总线ip核及监视系统 | |
CN116541227B (zh) | 故障诊断方法、装置、存储介质、电子装置及bmc芯片 | |
WO2017084523A1 (zh) | 一种片上系统总线行为检测方法、装置和计算机存储介质 | |
US6304911B1 (en) | Information packet reception indicator for reducing the utilization of a host system processor unit | |
CN101154202B (zh) | 管理多处理器计算机系统中的系统管理中断的系统和方法 | |
US20100217905A1 (en) | Synchronization Optimized Queuing System | |
WO2012149746A1 (zh) | 一种串口波特率配置方法及相关设备、系统 | |
US7263568B2 (en) | Interrupt system using event data structures | |
CN110175146B (zh) | 硬盘信息获取方法和获取硬盘信息的装置 | |
US6167480A (en) | Information packet reception indicator for reducing the utilization of a host system processor unit | |
CN119201805A (zh) | 基于串口实现的多机通信数据处理方法和多机通信系统 | |
EP2926259B1 (en) | Usb device interrupt signal | |
CN110765045A (zh) | 一种基于fpga的中断延时计数系统及方法 | |
Intel | ||
CN115378935A (zh) | 通信方法、安全芯片、终端设备和存储介质 | |
GB2423165A (en) | Host controller interface for packet-based timeshared bus | |
CN116560949B (zh) | 一种数据采集与接收的实现方法、系统、设备及存储介质 | |
CN118487697B (zh) | 时间同步方法 | |
CN118966099B (zh) | 一种验证方法、装置、电子设备及可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |