基于龙芯2K处理器的Linux系统串口数据包可靠传输方法技术方案

技术编号:36873602 阅读:12 留言:0更新日期:2023-03-15 20:17
本发明专利技术涉及一种基于龙芯2K处理器的Linux系统串口数据包可靠传输方法,属于串口通信技术领域。本发明专利技术可以在不更改Linux系统内核串口驱动以及串口子系统的前提下,在非实时、批处理的Linux系统中实现串口数据包可靠传输。而且本发明专利技术可以在仅仅更改串口接口函数的情况下,使用户程序接收到的串口数据包不间断,保证了用户程序对于数据的完整性判断正确。另外,本发明专利技术充分利用了Glibc库中的串口发送、接收数据接口函数。因此,本发明专利技术的方法具有良好的代码可移植性。相比现有技术的方案,本发明专利技术的方法对于串口通信的性能有极小影响。的方法对于串口通信的性能有极小影响。的方法对于串口通信的性能有极小影响。

【技术实现步骤摘要】
基于龙芯2K处理器的Linux系统串口数据包可靠传输方法


[0001]本专利技术属于串口通信
,具体涉及一种基于龙芯2K处理器的Linux系统串口数据包可靠传输方法。

技术介绍

[0002]当下龙芯2K处理器平台上集成了12个UART控制器,通过APB总线与总线桥通信。UART控制器提供与其他外部设备串行通信的功能,例如与另外一台计算,以RS232为标准使用UART串行线路进行通信。其中,UART0、UART3、UART4、UART5复用UART0接口;UART1、UART6、UART7、UART8复用UART1接口;UART2、UART9、UART10、UART11复用UART2接口,如图1中硬件层所示。此外,如图1所示,软件层运行Linux系统。Linux系统包含用户态和内核态。用户态的串口进程通过Glibc软件库的UART串口字符设备接口,实现通过串口与其他外部设备进行串行通信功能。串口进程将需要发送的串口数据帧拷贝到UART串口驱动core层的UART串口循环缓存空间中。UART串口驱动core层将UART串口循环缓存空间的串口数据帧,通过UART接口控制器驱动,根据设备描述符路由到指定的UART设备上。而串口进程将需要接收的串口数据帧则是通过UART接口控制器驱动中定义的UART设备获取到UART串口驱动core层中的UART串口循环缓存空间中。串口进程进而通过Glibc软件库的UART串口字符设备接口读取串口数据帧到串口进程的进程空间中。另外,因为Linux系统是基于宏内核设计的非实时、批处理系统。串口进程如同其他Linux系统用户态中其他进程一样,由Linux系统内核态的宏内核任务调度器进行调度。
[0003]现有的龙芯2K处理器平台上运行的Linux系统所使用的任务调度器,是基于非剥夺策略的调度算法实现的调度器,属于非实时调度器。这就导致串口进程在收发数据的时候,会被Linux系统任务调度器因为任务调度的需要,将串口进程调度出去。因此会导致串口进程不运行,故而导致串口进程收发数据中断。而串口进程收发数据中断,会导致串口进程误认为数据收发完成。而接下来用户态其他程序使用串口进程收发的数据时,数据不完整,进而导致错误。此外,Linux系统中的UART驱动子系统,是比较完善且强壮的广泛通用代码,贸然改动会导致不可预知的错误,严重的可能导致整个Linux系统崩溃。而用户开发的基于串口的应用程序,尤其是已经比较完善的应用程序,贸然更改对串口的收发子程序,也会导致用户应用程序的稳定性降低。这极大地增加了用户应用程序的开发和维护的时间成本和人力成本。

技术实现思路

[0004](一)要解决的技术问题
[0005]本专利技术要解决的技术问题是:如何设计一种Linux系统下串口数据包的可靠传输方法,保证用户态的串口进程发送、接收的串口数据是用户预期的数据,不会因为Linux系统任务调度器调度导致产生用户预期数据不完整的缺陷。
[0006](二)技术方案
[0007]为了解决上述技术问题,本专利技术提供了一种基于龙芯2K处理器的Linux系统串口数据包可靠传输方法,该方法基于在Linux系统的用户态开发的一种程序组件实现,所述程序组件的结构分为三层,分别是用户层、内核层和硬件层;用户层运行串口进程,实现串口发送数据和串口接收数据功能;内核层用于实现UART串口驱动程序;硬件层包含UART串口通信链路,设A端和B端分别是运行所述程序组件的两个设备端,则A端的Linux系统与虚框B端的Linux系统之间通过UART串口通信线路进行通信,A端和B端运行的程序相同,A端和B端中的用户层均运行发送数据工作模块和接收数据工作模块这两个模块,其中,发送数据工作模块包含数据封装模块程序、定长包发送模块程序和Glibc库串口发送数据接口,接收数据工作模块包含数据解析模块程序、定长包接收模块程序和Glibc库串口接收数据接口,A端的发送数据工作模块发送数据给B端的接收数据工作模块,而B端的发送数据工作模块发送数据给A端的接收数据工作模块。
[0008]优选地,该方法包含两个工作流程,分别是串口数据发送工作流程和串口数据接收工作流程。
[0009]优选地,所述串口数据发送工作流程如下:
[0010]步骤A1:用户开发的应用程序根据需求准备开始发送串口数据;
[0011]步骤A2:数据封装模块程序根据步骤A1中需要发送的串口数据长度计算可以封装成定长串口数据包的数量;
[0012]步骤A3:数据封装模块程序封装一个包头数据包,该包头数据包记录将要发送数据的包数,并且数据封装模块程序判断步骤A2中计算可以封装成定长串口数据包的数据量是否大于1,如果大于1则进入步骤A4中,否则进入步骤A5;
[0013]步骤A4:数据封装模块程序将步骤A1需要发送的串口数据封装成多个数据包,完成后进入步骤A6;
[0014]步骤A5:数据封装模块程序将步骤A1需要发送的串口数据封装成一个数据包,完成后进入步骤A6;
[0015]步骤A6:该定长包发送模块程序发送一个步骤A3中数据封装模块程序封装的一个包头数据包;
[0016]步骤A7:通过Glibc库串口发送数据接口发送包头数据包中的串口数据帧;
[0017]步骤A8:定长包发送模块程序判断数据包头数据包发送是否完成,若完成发送,则进入步骤A9,否则返回步骤A7,发送包头数据包中未完成发送的串口数据帧;
[0018]步骤A9:定长包发送模块程序顺序选择一个步骤A4或者步骤A5封装的还未发送的数据包,进入到步骤A10中;
[0019]步骤A10:发送数据包所使用的Glibc库串口发送数据接口与步骤A7使用的Glibc库串口发送数据接口相同。通过Glibc库串口发送数据接口发送数据包中的串口数据帧;
[0020]步骤A11:定长包发送模块程序判断数据包发送是否完成,若完成发送,则进入步骤A12,否则返回步骤A10,发送数据包中未完成发送的串口数据帧;
[0021]步骤A12:定长包发送模块程序判断所有的数据包发送是否完成,若完成则进入步骤A13,否则跳回步骤A9中,接着发送下一个还未发送的数据包;
[0022]步骤A13:用户开发的应用程序完成发送串口数据。
[0023]优选地,所述串口数据接收工作流程如下:
[0024]步骤B1:用户开发的应用程序通过串口中断开始接收串口数据;
[0025]步骤B2:定长包接收模块程序通过Glibc库串口接收数据接口接收串口数据帧;
[0026]步骤B3:定长包接收模块程序计算所接收到的串口数据帧个数是否为一包长度,若是则进入步骤B4,否则返回步骤B2继续接收串口数据帧;
[0027]步骤B4:数据解析模块程序解析步骤B3接收到的数据包头,获得所要接收到的数据包数量;
[0028]步骤B5:定长包接收模块程序接收串口数据帧;
[0029]步骤B6:定长包接收模块程序计算所接收到的串口数据帧个数是否为本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于龙芯2K处理器的Linux系统串口数据包可靠传输方法,其特征在于,该方法基于在Linux系统的用户态开发的一种程序组件实现,所述程序组件的结构分为三层,分别是用户层、内核层和硬件层;用户层运行串口进程,实现串口发送数据和串口接收数据功能;内核层用于实现UART串口驱动程序;硬件层包含UART串口通信链路,设A端和B端分别是运行所述程序组件的两个设备端,则A端的Linux系统与虚框B端的Linux系统之间通过UART串口通信线路进行通信,A端和B端运行的程序相同,A端和B端中的用户层均运行发送数据工作模块和接收数据工作模块这两个模块,其中,发送数据工作模块包含数据封装模块程序、定长包发送模块程序和Glibc库串口发送数据接口,接收数据工作模块包含数据解析模块程序、定长包接收模块程序和Glibc库串口接收数据接口,A端的发送数据工作模块发送数据给B端的接收数据工作模块,而B端的发送数据工作模块发送数据给A端的接收数据工作模块。2.如权利要求1所述的方法,其特征在于,该方法包含两个工作流程,分别是串口数据发送工作流程和串口数据接收工作流程。3.如权利要求2所述的方法,其特征在于,所述串口数据发送工作流程如下:步骤A1:用户开发的应用程序根据需求准备开始发送串口数据;步骤A2:数据封装模块程序根据步骤A1中需要发送的串口数据长度计算可以封装成定长串口数据包的数量;步骤A3:数据封装模块程序封装一个包头数据包,该包头数据包记录将要发送数据的包数,并且数据封装模块程序判断步骤A2中计算可以封装成定长串口数据包的数据量是否大于1,如果大于1则进入步骤A4中,否则进入步骤A5;步骤A4:数据封装模块程序将步骤A1需要发送的串口数据封装成多个数据包,完成后进入步骤A6;步骤A5:数据封装模块程序将步骤A1需要发送的串口数据封装成一个数据包,完成后进入步骤A6;步骤A6:该定长包发送模块程序发送一个步骤A3中数据封装模块程序封装的一个包头数据包;步骤A7:通过Glibc库串口发送数据接口发送包头数据包中的串口数据帧;步骤A8:定长包发送模块程序判断数据包头数据包发送是否完成,若完成发送,则进入步骤A9,否则返回步骤A7,发送包头数据包中未完成发送的串口数据帧;步骤A...

【专利技术属性】
技术研发人员:马帅黄聿澍张明庆姜有田
申请(专利权)人:北京计算机技术及应用研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1