一种基于Linux系统的UART收发数据的方法与流程
未命名
09-10
阅读:227
评论:0

一种基于linux系统的uart收发数据的方法
技术领域
1.本发明属于数据收发方式技术领域,具体是指一种基于linux系统的uart收发数据的方法。
背景技术:
2.目前大多数嵌入式处理器都包含了uart模块,除了用于基本的调试串口功能,也用于与其他串口模块进行通讯。实时系统和非实时操作系统都提供了标准的串口驱动程序和对应的应用程序接口,用户能够很容易根据标准串口操作接口进行串口编程。在实际项目应用中串口通讯发挥着必不可少的作用。
3.随着市场的发展,市面上出现了各种各样的串口模块,如串口屏、串口蓝牙模块、串口wifi模块等。由于串口仅需要2根信号线,对数据传输速率要求不高的模块都会选择兼容串口功能,或者选择串口作为高速模块的配置接口。此外,为了适应串口各种情况下通讯功能,串口扩展了rs232、rs422和rs485等电平信号,使串口能够实现远距离传输,在工控领域发挥着非常重要的作用。
4.基于linux系统的uart属于串行低速设备,linux内核中支持一系列标准的波特率,非标准波特率需要在内核和编译器中进行修改添加对应的波特率。在开发过程中,开发人员能够通过linux系统中uart驱动提供的系统操作接口,对uart进行配置,应用程序可以根据实际需求对uart的波特率、数据位、停止位等参数进行配置。这些操作接口帮助软件开发人员快速、便捷的使用uart进行项目开发,因而uart通讯功能在实际项目中受到广泛应用。
5.在使用uart进行项目开发时,对uart传输本身的波特率要求并不是很高,但因uart协议本身没有自动校准的特性,在实际应用场景中需要高频次的收发数据。如果cpu性能无法满足要求,就会出现uart接收数据丢失的现象,但要想满足uart高频次收发的要求,就需要cpu有足够高的主频。在cpu主频相同的情况下,无操作系统和实时操作系统比linux之类的分时操作系统能够支持更高频次的uart收发。由于分时操作系统需要消耗更多的cpu资源与用户交互,又没有抢占机制,所以分时操作系统无法满足高频次的uart数据收发。
6.由此可见,如果在linux系统平台下的项目开发中,要想使用高频次的uart数据实现收发,只能选择更高主频的cpu开发平台或者降低项目中的uart数据收发频次。但无论是更换cpu开发平台还是降低uart收发频次都不是最好的选择,挑选合适的开发平台和熟悉新的开发平台都不是一件简单的事情,更换cpu开发平台无疑会影响项目进度,而降低uart数据收发频次也会降低项目产品最终的性能。
7.因此,对于在项目中使用uart高频次收发,而本身cpu开发平台的主频在使用linux系统开发项目时uart数据收发频次不满足要求的情况,需要一种更高效的uart收发方式。
技术实现要素:
8.针对上述情况,为克服现有技术中linux系统下uart收发数据方式存在的技术不足的问题,本发明提供了一种基于linux系统的uart收发数据的方法,具有不依赖linux系统的cpu,独立完成uart收发过程的特性,提高uart通讯效率,提升uart软件性能,为当前平台运行linux系统中uart收发频次无法满足要求提供一种优化选择。
9.本发明采取的技术方案如下:本发明一种基于linux系统的uart收发数据的方法,包括如下步骤:
10.s1:uart的dma接收需要先通过ioctl函数接口初始化并开启dma接收;
11.s2:当uart硬件接口收到数据后,驱动层的dma会自动将uart控制器接收到的数据放入物理内存;
12.s3:当dma传输结束后会触发中断,cpu会重新配置并开启dma传输,进行下一轮的dma传输。
13.作为进一步阐述的方案,所述方法由基于linux系统的uart收发数据系统支持执行,所述基于linux系统的uart收发数据系统包括软件部分和硬件部分,用于uart参数配置、uart数据发送和uart数据接收;
14.所述系统的软件部分包括应用层和驱动层,所述驱动层基于linux内核平台,所述应用层负责外设接口管理,所述驱动层提供有驱动程序与应用层提供的应用程序配合设有uart收发程序;
15.所述系统的硬件部分包括cpu、uart和dma控制器,所述uart控制器用于获取和发送串口总线上的数据,所述cpu用于配置uart控制器参数、记录环形缓冲区信息以及控制dma控制器的开启和关闭,所述dma控制器控制uart控制器收发缓冲器与dma控制器映射的物理内存间的数据搬移,实现uart数据收发过程脱离cpu控制,节省cpu资源的功能。
16.进一步方案中,所述软件部分还包括环形缓冲区,通过head和tail两个指针来协助存入和取出数据,所述应用程序只负责从环形缓冲区中存取数据。
17.进一步地,所述驱动程序只负责dma控制器与uart的配置和uart的dma数据传输;驱动程序在uart的dma传输结束后,触发dma传输结束中断。
18.进一步地,所述驱动程序提供的操作接口配置uart参数、uart发送数据和开启dma接收uart数据。
19.进一步地,在使用uart接收之前,通过驱动程序提供的操作接口配置uart的波特率、数据位、停止位等参数,uart配置完成之后,就可以进行正常的uart数据收发。
20.进一步地,所述uart接收数据需要用户主动开启和关闭uart的dma传输,当uart的dma接收开启后,驱动会自动将接收到的数据放入为dma申请的物理内存中,用户直接从该物理内存映射的虚拟内存中获取数据即可。
21.进一步方案中,所述uart发送数据是用户主动发起的动作,不会过多占用cpu资源,如果项目中不使用高频次的发送,使用普通发送即可满足要求。如果uart数据发送也要求高频次发送,可以用与uart接收数据一样的方式实现uart的dma数据发送方式。
22.进一步的,所述驱动程序为应用程序提供的ioctl函数接口能够对uart的波特率、数据位、停止位等进行配置,应用程序可以通过驱动程序提供的write系统接口实现uart的普通发送。
23.本方案一种基于linux系统的uart收发数据的方法,采用上述方案本发明取得的有益效果如下:
24.1、针对现有linux系统下uart收发数据方式存在的技术的不足,使产品开发中uart支持更高频次的数据收发,以提高uart通讯效率,提升uart软件性能。
25.2、通过采取上述的设计方案,能够有效提高linux系统下uart接收数据的频次,当项目需要在开发平台运行linux系统时,开发人员在无法满足uart高频次数据收发性能要求的情况下,无需更换引脚开发平台或者降低软件性能。
26.3、另外充分考虑到了不同硬件平台的可兼容性,避免因为硬件平台的变化而导致的操作流程变化,该方案能够有效的提升开发效率,帮助开发人员更好更快的完成uart接收数据操作。
附图说明
27.图1为本发明一种基于linux系统的uart收发数据的方法的组成示意图。
28.附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。
具体实施方式
29.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例;基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
30.如图1所示,本发明一种基于linux系统的uart收发数据的方法,,包括如下步骤:
31.s1:uart的dma接收需要先通过ioctl函数接口初始化并开启dma接收;
32.s2:当uart硬件接口收到数据后,驱动层的dma会自动将uart控制器接收到的数据放入物理内存;
33.s3:当dma传输结束后会触发中断,cpu会重新配置并开启dma传输,进行下一轮的dma传输。
34.作为进一步阐述的方案,所述方法由基于linux系统的uart收发数据系统支持执行,所述基于linux系统的uart收发数据系统包括软件部分和硬件部分,用于uart参数配置、uart数据发送和uart数据接收;
35.所述系统的软件部分包括应用层和驱动层,所述驱动层基于linux内核平台,所述应用层负责外设接口管理,所述驱动层提供有驱动程序与应用层提供的应用程序配合设有uart收发程序;
36.所述系统的硬件部分包括cpu、uart和dma控制器,所述uart控制器用于获取和发送串口总线上的数据,所述cpu用于配置uart控制器参数、记录环形缓冲区信息以及控制dma控制器的开启和关闭,所述dma控制器控制uart控制器收发缓冲器与dma控制器映射的物理内存间的数据搬移,实现uart数据收发过程脱离cpu控制,节省cpu资源的功能。
37.本设计实现了一个uart驱动,使开发人员通过驱动提供的应用程序接口配置uart参数和收发数据。该驱动与linux内核提供的标准uart驱动功能上大体相同,其区别在于该
驱动的数据接收部分由dma控制器完成。虽然linux提供的标准驱动中也可以添加dma功能,但其本质还是借助普通数据收发方式驱动架构实现,需要频繁的进行系统调用,高频次的uart接收过程会占用大量cpu资源。
38.该方案的功能主要包含三部分,即uart参数配置、uart数据发送和uart数据接收。开发人员只需通过该设计方式的驱动程序提供的操作接口配置uart参数、uart发送数据和开启dma接收uart数据。
39.在使用uart接收之前,通过驱动提供的操作接口配置uart控制器的波特率、数据位、停止位等参数。uart配置完成之后,就可以进行正常的uart数据收发。
40.uart接收数据需要用户主动开启和关闭uart的dma传输,当uart的dma接收开启后,驱动会自动将接收到的数据放入为dma申请的物理内存中,用户直接从该物理内存映射的虚拟内存中获取数据即可。
41.uart发送数据是用户主动发起的动作,不会过多占用cpu资源,如果项目中不使用高频次的发送,使用普通发送即可满足要求。如果uart数据发送也要求高频次发送,可以用与uart接收数据一样的方式实现uart的dma数据发送方式。
42.为了方便存入和取出数据,通过软件将申请的内存虚拟为环形缓冲区,并通过head和tail两个指针来协助存入和取出数据。当驱动层完成一次dma搬移后,tail指针会自动向后偏移dma搬移的数据个数。应用层可直接从映射后的地址中获取数据,当通过head和tail获取环形缓冲区中数据个数后,应用层可直接读取相应的数据,之后head自动减去读取数据的个数。同理,uart的dma发送过程,也可以通过相同的方式实现。
43.本设计主要通过在驱动中申请一块连续的物理内存,并将其映射到应用层,以此实现驱动层与应用层的uart数据交换。驱动程序为应用程序提供的ioctl函数接口能够对uart的波特率、数据位、停止位等进行配置。应用程序可以通过驱动程序提供的write系统接口实现uart的普通发送。
44.uart的dma接收需要先通过ioctl函数接口初始化并开启dma接收,当uart硬件接口收到数据后,驱动层的dma会自动将uart控制器接收到的数据放入物理内存。当dma传输结束后会触发中断,cpu会重新配置并开启dma传输,进行下一轮的dma传输。
45.为了方便存入和取出数据,通过软件将申请的内存虚拟为环形缓冲区,并通过head和tail两个指针来协助存入和取出数据。当驱动层完成一次dma搬移后,tail指针会自动向后偏移dma搬移的数据个数。应用层可直接从映射后的地址中获取数据,当通过head和tail获取环形缓冲区中数据个数后,应用层可直接读取相应的数据,之后head自动减去读取数据的个数。同理,uart的dma发送过程,也可以通过相同的方式实现。
46.此外,该种方式并不只适用于单个uart通讯,可根据dma的通道数配置相应的uart的dma接收和发送。由于驱动层的收发过程与应用层存取数据过程分离,因而只需在驱动层添加对应uart的数据分区并配置相应的dma即可,并不会增加用户层与驱动层的数据交互,也不会过多的增加cpu资源的损耗。
47.综上所述,仅为本方案较常用的具体实施方式,但本方案的使用范围并不局限于此,任何在当前平台linux系统主频无法满足项目需要的外设接收频率的情况下,都可以在本方案的基础上做修改,如spi、i2c等。因此,本方案的具体功能以实际应用为准。
48.尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以
理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。总而言之如果本领域的普通技术人员受其启示,在不脱离本发明创造宗旨的情况下,不经创造性的设计出与该技术方案相似的结构方式及实施例,均应属于本发明的保护范围。
技术特征:
1.一种基于linux系统的uart收发数据的方法,其特征在于:s1:uart的dma接收需要先通过ioctl函数接口初始化并开启dma接收;s2:当uart硬件接口收到数据后,驱动层的dma会自动将uart控制器接收到的数据放入物理内存;s3:当dma传输结束后会触发中断,cpu会重新配置并开启dma传输,进行下一轮的dma传输。2.根据权利要求1所述的一种基于linux系统的uart收发数据的方法,其特征在于:包括基于linux系统的uart收发数据系统,所述系统包括软件部分和硬件部分,用于uart参数配置、uart数据发送和uart数据接收;所述系统的软件部分包括应用层、驱动层、环形缓冲区,所述驱动层基于linux内核平台,所述应用层负责外设接口管理,所述驱动层提供有驱动程序与应用层提供的应用程序配合设有uart收发程序,所述环形缓冲区中通过head和tail两个指针来协助存入和取出数据;所述系统的硬件部分包括cpu、uart和dma控制器,所述uart控制器用于获取和发送串口总线上的数据,所述cpu用于配置uart控制器参数、记录环形缓冲区信息以及控制dma控制器的开启和关闭,所述dma控制器控制uart控制器收发缓冲器与dma控制器映射的物理内存间的数据搬移,实现uart数据收发过程脱离cpu控制,节省cpu资源的功能。3.根据权利要求2所述的一种基于linux系统的uart收发数据的方法,其特征在于:所述应用程序只负责从环形缓冲区中存取数据,连续物理地址在驱动和应用中会被虚拟为环形缓冲区,通过head和tail两个指针来协助存入和取出数据、并用来定位数据位置;驱动程序申请一块的连续物理地址作为dma传输的目标地址,将驱动程序为dma申请的物理地址映射到应用层,应用层进行相应的映射就可以直接访问作为dma目的地址的物理地址。4.根据权利要求3所述的一种基于linux系统的uart收发数据的方法,其特征在于:所述驱动程序提供的操作接口配置uart参数、uart发送数据和开启dma接收uart数据;所述驱动程序只负责dma控制器与uart的配置和uart的dma数据传输;所述驱动程序在uart的dma传输结束后,触发dma传输结束中断。5.根据权利要求4所述的一种基于linux系统的uart收发数据的方法,其特征在于:所述应用程序通过linux系统提供的ioctl接口函数配置uart参数和启停uart的dma传输;所述uart接收数据需要用户主动开启和关闭uart的dma传输,当uart的dma接收开启后,驱动会自动将接收到的数据放入为dma申请的物理内存中,用户直接从该物理内存映射的虚拟内存中获取数据即可。6.根据权利要求5所述的一种基于linux系统的uart收发数据的方法,其特征在于:数据写入环形缓冲区后修改缓冲区尾指针,读出数据后修改缓冲区头指针,且能够通过首尾指针确认缓冲区中剩余数据个数。7.根据权利要求6所述的一种基于linux系统的uart收发数据的方法,其特征在于:步骤s3中,dma中断处理程序中修改相应参数,并重新开启dma传输。8.根据权利要求7所述的一种基于linux系统的uart收发数据的方法,其特征在于:功能可根据实际应用进行扩展,不仅局限于所述功能;且可以移植到不同的含有dma控制器的硬件平台上,而该设计的使用方式不受影响。
9.根据权利要求8所述的一种基于linux系统的uart收发数据的方法,其特征在于:能够增加多个uart的dma并行收发,不局限于单个uart的收发。10.根据权利要求1所述的一种基于linux系统的uart收发数据的方法,其特征在于:dma操作的外设可以是任何接口,如spi、i2c。
技术总结
本发明公开了一种基于Linux系统的UART收发数据的方法,包括UART的DMA接收需要先通过ioctl函数接口初始化并开启DMA接收;当UART硬件接口收到数据后,驱动层的DMA会自动将UART控制器接收到的数据放入物理内存;当DMA传输结束后会触发中断,CPU会重新配置并开启DMA传输,进行下一轮的DMA传输。本发明属于数据收发方式技术领域,具体是提供了一种具有不依赖Linux系统的CPU,独立完成UART收发过程的特性,提高UART通讯效率,提升UART软件性能,收发频次可以满足要求的基于Linux系统的UART收发数据的方式。数据的方式。
技术研发人员:张凯
受保护的技术使用者:北京神州龙芯科技有限公司
技术研发日:2023.06.25
技术公布日:2023/9/7
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/
上一篇:一种分段式锂离子电池极片、二次电池的制作方法 下一篇:分布式爬虫方法及系统与流程