在Linux系统中,UART(Universal Asynchronous Receiver/Tranitter)是一个重要的设备,它是连接计算机和外部设备的桥梁,例如串行口,CAN总线等。而在与UART通信的过程中,数据的传输速度也是非常的关键。因此,在实际的应用中,我们需要使用一些技巧来提高UART的传输效率,FIFO(First-In-First-Out)技术就是其中之一。FIFO指的是一个有限的队列,先进入的数据首先被处理。在Linux系统中,通过使用UART FIFO,可以显著提高UART的传输速度。那么,在本文中,我们将介绍如何在Linux系统下使用UART FIFO。
1. 什么是UART FIFO
在Linux系统中,UART FIFO是一个硬件上的缓存,用于存储串行数据流从输入输出口进出串口控制器的数据。它是一个带有记录指针和数据缓存空间的缓存区。通常情况下,UART FIFO具有下列几个特点:
– 有限的存储空间
– 读写指针用于记录FIFO缓冲区的状态
– 数据按照输入的先后顺序存储,因此读出来的数据与写入的顺序相同(即先进先出)
使用UART FIFO可以显著提高串口的数据处理速率,因为它可以在接收数据时缓存一定量的数据,并在处理完成之后再将数据发送出去。
2. Linux下的UART FIFO
一般情况下,在Linux系统中,UART设备驱动程序是由串口控制器的芯片提供的,例如常见的串口芯片8250或16550等。而对于Linux系统来说,支持UART FIFO的串口驱动程序通常为serial_core.c/serial8250.c。同时,在Linux系统中,也提供了一系列的API和函数,用于操作和控制UART FIFO。
2.1. 串口设备文件
在Linux系统中,每个串口设备都有一个特定的设备文件,例如/dev/ttyS0、/dev/ttyS1等。当一个进程需要与串口通信时,需要通过打开该设备文件来建立与串口的连接。之后,该进程便可以通过读取和写入该设备文件来实现与串口的数据交换。
2.2. 使用UART FIFO
在Linux系统下,使用UART FIFO需要使用一系列的API和函数,例如tty_struct、tty_termios、serial8250_driver等。下面,我们将简要介绍如何使用UART FIFO:
2.2.1. 初始化UART FIFO
在使用UART FIFO之前,需要对其进行初始化。对于8250/16550等常见的串口芯片,可以通过调用serial8250_init_port函数进行初始化。该函数的原型为:
int serial8250_init_port(struct uart_port *port);
其中,uart_port是描述串口设备的结构体。
2.2.2. 开启UART FIFO
在初始化UART FIFO之后,需要通过调用serial8250_set_termios函数开启UART FIFO功能。该函数的原型为:
int serial8250_set_termios(struct uart_port *port, struct ktermios *termios, struct ktermios *old);
其中,ktermios是终端设置结构体,保存UART设备的所有设置,例如波特率、奇偶校验等。
2.2.3. 读取UART FIFO数据
在读取UART FIFO数据时,可以调用tty_read函数。该函数原型为:
static ssize_t tty_read(struct file *file, char *buf, size_t count, loff_t *ppos);
其中:file表示要读取的设备文件,buf表示缓存区,count表示读取的字节数。
2.2.4. 写入UART FIFO数据
在写入UART FIFO数据时,可以调用tty_write函数。该函数原型为:
static ssize_t tty_write(struct file *file, const char *buf, size_t count, loff_t *ppos);
其中:file表示要写入的设备文件,buf表示数据缓存区,count表示写入的字节数。
3. 使用UART FIFO的注意事项
在使用UART FIFO时,需要注意以下几点:
3.1. 开启UART FIFO需要满足一些条件,例如:波特率、数据位、停止位等应该与外设一致。
3.2. 在接收数据时,需要设置一个合适的FIFO缓存。如果缓存太小,会丢失数据;如果缓存太大,会浪费内存。通常情况下,缓存的大小可以根据应用需求确定。例如,当需要读取大量的数据时,可以增大FIFO的缓存。
3.3. 由于UART FIFO在串口传输时存在一定的延迟,因此在发送、接收数据时需要设置合适的超时时间,以保证数据的正确传输。可以通过调用tty_set_termios函数,设置超时时间。
4.
在Linux系统中,UART FIFO是一个用于提高串口数据处理速度的非常重要的技术。使用UART FIFO,可以在发送和接收数据时同时处理多个数据,从而提高串口传输的效率。通过本文的介绍,我们了解了在Linux系统中使用UART FIFO的一些基本概念、API和函数,也了解了使用UART FIFO时需要注意的一些问题。希望本文对各位读者有所帮助。
成都网站建设公司-创新互联为您提供网站建设、网站制作、网页设计及定制高端网站建设服务!
配置串口需要包含
头文件
其中最核心的配置
结构体
为:
如何获取该结构呢?我们操作串口跟操作文件一样,也是调用 open() 函数来打开串口,
这样我们就能够得到一个
文件描述符
fd ,然后就可以调用 tcgetattr() 函数来获取上述配置结构体了。
Linux 串口默认的配置为:
波特率
9600,数据位 8 位,无
奇偶校验
,停止位 1 位,无 CTS/RTS 。
以下介绍一些常用的配置项:波特率、奇偶校验、数据位、停止位、硬件控制流。
相关接口:
Linux 将串口的波特率辩笑分为了输入波特率和输出波特率,不过最常用的场景是将两者设置成一样。
cfgetispeed() 函数获取输入波特率, cfgetospeed() 函数获取输出波特率。 cfsetispeed() 函数设置输入波特率, cfsetospeed() 函数用于设置输如掘出波特率,当然 cfsetspeed() 函数扩展为同时设置输入和输出波特率。
上述接口中的 speed_t 是一系列波特率的标志位,例如常用的波特率就为 B115200,参考下述选项:
设置奇渣灶核偶校验位可以通过修改 termios 结构体中的 c_cflag 成员来实现,若无校验,则将 PARENB 位设为 0;若有校验,则 PARENB 为 1。之后再根据 PARODD 来区分奇偶校验, PARODD 为 1 表示奇校验, PARODD 为 0 表示偶校验。例如设置无奇偶校验位:
设置数据位可以通过修改 termios 结构体中的 c_cflag 成员来实现,CS5、CS6、CS7 和 CS8 分别代表数据位 5、6、7 和 8。不过在设置数据位之前,需要先用 CSIZE 来做屏蔽字段,清楚这几个标志位,例如设置数据位为 8 位:
设置停止位可以通过修改 termios 结构体中的 c_cflag 成员来实现, CSTOPB 位为 1 表示 2 位停止位, CSTOPB 位为 0 标志 1 位停止位。例如设置停止位为 1 位:
设置硬件控制流可以通过修改 termios 结构体中的 c_cflag 成员来实现, CRTSCTS 为 1 表示使用硬件控制流,为 0 表示不使用硬件控制流。例如
使能
硬件控制流:
当然,最后还需要用 tcflush() 抛弃存储在 fd 里的未接收的数据。
再利用接口 tcsetattr() 函数将配置信息写入文件描述符 fd :
这样整个串口最常用的用法就配置完成了。
具体的配置使用可以参考我的项目 HCI-Middleware 里的 hci_transport_uart_linux.c 文件。
参考:
linux uart fifo的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux uart fifo,Linux下UART FIFO的使用,Linux C 配置串口的信息别忘了在本站进行查找喔。
创新互联-老牌IDC、云计算及IT信息化服务领域的服务供应商,业务涵盖IDC(互联网数据中心)服务、云计算服务、IT信息化、AI算力租赁平台(智算云),软件开发,网站建设,咨询热线:028-86922220
分享名称:Linux下UARTFIFO的使用(linuxuartfifo)
网页URL:http://www.shufengxianlan.com/qtweb/news42/329042.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联