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

文档序号:33463389发布日期:2023-03-15 05:41阅读:79来源:国知局
基于龙芯2K处理器的Linux系统串口数据包可靠传输方法与流程
基于龙芯2k处理器的linux系统串口数据包可靠传输方法
技术领域
1.本发明属于串口通信技术领域,具体涉及一种基于龙芯2k处理器的linux系统串口数据包可靠传输方法。


背景技术:

2.当下龙芯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系统内核态的宏内核任务调度器进行调度。
3.现有的龙芯2k处理器平台上运行的linux系统所使用的任务调度器,是基于非剥夺策略的调度算法实现的调度器,属于非实时调度器。这就导致串口进程在收发数据的时候,会被linux系统任务调度器因为任务调度的需要,将串口进程调度出去。因此会导致串口进程不运行,故而导致串口进程收发数据中断。而串口进程收发数据中断,会导致串口进程误认为数据收发完成。而接下来用户态其他程序使用串口进程收发的数据时,数据不完整,进而导致错误。此外,linux系统中的uart驱动子系统,是比较完善且强壮的广泛通用代码,贸然改动会导致不可预知的错误,严重的可能导致整个linux系统崩溃。而用户开发的基于串口的应用程序,尤其是已经比较完善的应用程序,贸然更改对串口的收发子程序,也会导致用户应用程序的稳定性降低。这极大地增加了用户应用程序的开发和维护的时间成本和人力成本。


技术实现要素:

4.(一)要解决的技术问题
5.本发明要解决的技术问题是:如何设计一种linux系统下串口数据包的可靠传输方法,保证用户态的串口进程发送、接收的串口数据是用户预期的数据,不会因为linux系统任务调度器调度导致产生用户预期数据不完整的缺陷。
6.(二)技术方案
7.为了解决上述技术问题,本发明提供了一种基于龙芯2k处理器的linux系统串口数据包可靠传输方法,该方法基于在linux系统的用户态开发的一种程序组件实现,所述程序组件的结构分为三层,分别是用户层、内核层和硬件层;用户层运行串口进程,实现串口发送数据和串口接收数据功能;内核层用于实现uart串口驱动程序;硬件层包含uart串口通信链路,设a端和b端分别是运行所述程序组件的两个设备端,则a端的linux系统与虚框b端的linux系统之间通过uart串口通信线路进行通信,a端和b端运行的程序相同,a端和b端中的用户层均运行发送数据工作模块和接收数据工作模块这两个模块,其中,发送数据工作模块包含数据封装模块程序、定长包发送模块程序和glibc库串口发送数据接口,接收数据工作模块包含数据解析模块程序、定长包接收模块程序和glibc库串口接收数据接口,a端的发送数据工作模块发送数据给b端的接收数据工作模块,而b端的发送数据工作模块发送数据给a端的接收数据工作模块。
8.优选地,该方法包含两个工作流程,分别是串口数据发送工作流程和串口数据接收工作流程。
9.优选地,所述串口数据发送工作流程如下:
10.步骤a1:用户开发的应用程序根据需求准备开始发送串口数据;
11.步骤a2:数据封装模块程序根据步骤a1中需要发送的串口数据长度计算可以封装成定长串口数据包的数量;
12.步骤a3:数据封装模块程序封装一个包头数据包,该包头数据包记录将要发送数据的包数,并且数据封装模块程序判断步骤a2中计算可以封装成定长串口数据包的数据量是否大于1,如果大于1则进入步骤a4中,否则进入步骤a5;
13.步骤a4:数据封装模块程序将步骤a1需要发送的串口数据封装成多个数据包,完成后进入步骤a6;
14.步骤a5:数据封装模块程序将步骤a1需要发送的串口数据封装成一个数据包,完成后进入步骤a6;
15.步骤a6:该定长包发送模块程序发送一个步骤a3中数据封装模块程序封装的一个包头数据包;
16.步骤a7:通过glibc库串口发送数据接口发送包头数据包中的串口数据帧;
17.步骤a8:定长包发送模块程序判断数据包头数据包发送是否完成,若完成发送,则进入步骤a9,否则返回步骤a7,发送包头数据包中未完成发送的串口数据帧;
18.步骤a9:定长包发送模块程序顺序选择一个步骤a4或者步骤a5封装的还未发送的数据包,进入到步骤a10中;
19.步骤a10:发送数据包所使用的glibc库串口发送数据接口与步骤a7使用的glibc库串口发送数据接口相同。通过glibc库串口发送数据接口发送数据包中的串口数据帧;
20.步骤a11:定长包发送模块程序判断数据包发送是否完成,若完成发送,则进入步骤a12,否则返回步骤a10,发送数据包中未完成发送的串口数据帧;
21.步骤a12:定长包发送模块程序判断所有的数据包发送是否完成,若完成则进入步骤a13,否则跳回步骤a9中,接着发送下一个还未发送的数据包;
22.步骤a13:用户开发的应用程序完成发送串口数据。
23.优选地,所述串口数据接收工作流程如下:
24.步骤b1:用户开发的应用程序通过串口中断开始接收串口数据;
25.步骤b2:定长包接收模块程序通过glibc库串口接收数据接口接收串口数据帧;
26.步骤b3:定长包接收模块程序计算所接收到的串口数据帧个数是否为一包长度,若是则进入步骤b4,否则返回步骤b2继续接收串口数据帧;
27.步骤b4:数据解析模块程序解析步骤b3接收到的数据包头,获得所要接收到的数据包数量;
28.步骤b5:定长包接收模块程序接收串口数据帧;
29.步骤b6:定长包接收模块程序计算所接收到的串口数据帧个数是否为一包长度,若是则进入步骤b7,否则返回步骤b5继续接收串口数据帧;
30.步骤b7:定长包接收模块程序计算所接收到的数据包个数是否为步骤b4中解析到的数据包头中数据包个数,若是则进入步骤b8,否则返回步骤b5继续接收串口数据帧;
31.步骤b8:数据解析模块程序解析所有接收到的数据包,提取所有数据包中的数据,并且将该数据传递给用户开发的应用程序,完成接收串口数据。
32.优选地,所述硬件层还包含uart串口控制器。
33.本发明还提供了一种用于实现所述方法的串口数据包可靠传输系统。
34.本发明还提供了一种基于所述方法实现的串口通信方法。
35.本发明还提供了一种基于所述系统实现的串口通信方法。
36.本发明还提供了一种所述方法在串口通信技术领域中的应用。
37.本发明还提供了一种所述系统在串口通信技术领域中的应用。
38.(三)有益效果
39.本发明可以在不更改linux系统内核串口驱动以及串口子系统的前提下,在非实时、批处理的linux系统中实现串口数据包可靠传输。而且本发明可以在仅仅更改串口接口函数的情况下,使用户程序接收到的串口数据包不间断,保证了用户程序对于数据的完整性判断正确。另外,本发明充分利用了glibc库中的串口发送、接收数据接口函数。因此,本发明的方法具有良好的代码可移植性。相比现有技术的方案,本发明的方法对于串口通信的性能有极小影响。
附图说明
40.图1为基于龙芯处理器的linux系统串口数据包传输现有技术方案示意图;
41.图2为实现本发明的方法的程序组件结构示意图;
42.图3为本发明的串口数据包可靠传输工作流程示意图。
具体实施方式
43.为使本发明的目的、内容和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
44.本发明提供的一种基于龙芯2k处理器的linux系统串口数据包可靠传输方法基于龙芯2k处理器平台之上运行的linux系统实现。主要是在linux系统的用户态开发了一套程序组件,以实现linux系统下串口数据包的可靠传输。本发明能够保证用户态的串口进程发送、接收的串口数据是用户预期的数据,不会因为linux系统任务调度器调度导致产生用户
预期数据不完整的缺陷。
45.本发明对于用户已经开发的应用程序在不用更改原有的程序逻辑的前提下,只更改用户已经开发的应用程序调用的串口程序接口函数,就可以保证linux系统下串口数据包的可靠传输。而且本发明开发的程序组件时间开销非常小,对于linux系统的串口收发性能影响非常小。
46.参考图2所示,本发明提供的一种基于龙芯2k处理器的linux系统串口数据包可靠传输方法,基于在linux系统的用户态开发的一种程序组件实现,程序组件的结构分为三层,分别是用户层、内核层和硬件层。用户层运行串口进程,实现串口发送数据和串口接收数据功能;内核层主要实现uart串口驱动程序;硬件层则包含uart串口控制器和uart串口通信链路。图2所示虚框a端和虚框b端均是基于龙芯2k处理器平台的linux系统。虚框a端的linux系统与虚框b端的linux系统之间通过uart串口通信线路进行通信。虚框a端和虚框b端运行的程序是相同的。虚框a端和虚框b端中串口工作模块均包含两个,分别是发送数据工作模块和接收数据模块。发送数据工作模块包含数据封装模块程序、定长包发送模块程序和glibc库串口发送数据接口。接收数据工作模块包含数据解析模块程序、定长包接收模块程序和glibc库串口接收数据接口。
47.以上程序组件中形成了串口数据发送程序组件和串口数据接收程序组件,参考图3,本发明的基于龙芯处理器的linux系统串口数据包可靠传输方法包含两个工作流程,分别是串口数据发送程序组件的串口数据发送工作流程和串口数据接收程序组件的串口数据接收工作流程,分别如下:
48.串口数据发送程序组件的串口数据发送工作流程如下:
49.步骤a1:用户开发的应用程序根据需求准备开始发送串口数据;
50.步骤a2:如图2中所示的数据封装模块程序。串口数据发送程序组件的数据封装模块程序根据步骤a1中需要发送的串口数据长度计算可以封装成定长串口数据包的数量;
51.步骤a3:数据封装模块程序封装一个包头数据包,该包头数据包记录将要发送数据的包数,并且数据封装模块程序判断步骤a2中计算可以封装成定长串口数据包的数据量是否大于1,如果大于1则进入步骤a4中,否则进入步骤a5;
52.步骤a4:数据封装模块程序将步骤a1需要发送的串口数据封装成多个数据包,完成后进入步骤a6;
53.步骤a5:数据封装模块程序将步骤a1需要发送的串口数据封装成一个数据包,完成后进入步骤a6;
54.步骤a6:如图2中所示的定长包发送模块程序。该定长包发送模块程序发送一个步骤a3中数据封装模块程序封装的一个包头数据包;
55.步骤a7:如图2中所示的glibc库串口发送数据接口。串口数据发送程序组件通过glibc库串口发送数据接口发送包头数据包中的串口数据帧;
56.步骤a8:串口数据发送程序组件的定长包发送模块程序判断数据包头数据包发送是否完成,若完成发送,则进入步骤a9,否则返回步骤a7,发送包头数据包中未完成发送的串口数据帧;
57.步骤a9:串口数据发送程序组件的定长包发送模块程序顺序选择一个步骤a4或者步骤a5封装的还未发送的数据包,进入到步骤a10中;
58.步骤a10:串口数据发送程序组件发送数据包所使用的glibc库串口发送数据接口与步骤a7使用的glibc库串口发送数据接口相同。串口数据发送程序组件通过glibc库串口发送数据接口发送数据包中的串口数据帧;
59.步骤a11:串口数据发送程序组件的定长包发送模块程序判断数据包发送是否完成,若完成发送,则进入步骤a12,否则返回步骤a10,发送数据包中未完成发送的串口数据帧;
60.步骤a12:串口数据发送程序组件的定长包发送模块程序判断所有的数据包发送是否完成,若完成则进入步骤a13,否则跳回步骤a9中,接着发送下一个还未发送的数据包;
61.步骤a13:用户开发的应用程序完成发送串口数据。
62.串口数据接收程序组件的串口数据接收工作流程如下:
63.步骤b1:用户开发的应用程序通过串口中断开始接收串口数据;
64.步骤b2:如图2中所示glibc库串口接收数据接口以及定长包接收模块程序。串口数据接收程序组件的定长包接收模块程序通过glibc库串口接收数据接口接收串口数据帧;
65.步骤b3:串口数据接收程序组件的定长包接收模块程序计算所接收到的串口数据帧个数是否为一包长度,若是则进入步骤b4,否则返回步骤b2继续接收串口数据帧;
66.步骤b4:如图2中所示数据解析模块程序。串口数据接收程序组件的数据解析模块程序解析步骤b3接收到的数据包头,获得串口数据接收程序组件所要接收到的数据包数量;
67.步骤b5:同步骤b2,串口数据接收程序组件的定长包接收模块程序接收串口数据帧;
68.步骤b6:串口数据接收程序组件的定长包接收模块程序计算所接收到的串口数据帧个数是否为一包长度,若是则进入步骤b7,否则返回步骤b5继续接收串口数据帧;
69.步骤b7:串口数据接收程序组件的定长包接收模块程序计算所接收到的数据包个数是否为步骤b4中解析到的数据包头中数据包个数,若是则进入步骤b8,否则返回步骤b5继续接收串口数据帧;
70.步骤b8:串口数据接收程序组件的数据解析模块程序解析所有接收到的数据包,提取所有数据包中的数据,并且将该数据传递给用户开发的应用程序,完成接收串口数据。
71.与现有linux系统串口数据包发送的现有技术相比,本发明提出的方法实现了linux系统串口数据包可靠传输。本发明所提出的方法不需要修改硬件主板和固件,也不需要修改linux系统内核的串口驱动和串口子系统。本发明与现有技术相比,串口发送、接收数据的性能没有明显的差异。本发明与背景技术均通过linux系统的串口发送100000次1024字节长度的字符串。本发明可以保证用户程序发送和接收的串口数据包100%不间断。而在相同硬件、软件环境下的现有技术下的用户程序,发送的串口数据包30.113%间断,发送的串口数据包94.477%间断。
72.性能对比如下表1所示。
73.表1本发明与现有技术性能对比
[0074][0075]
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1