Linux下UART FIFO的使用 (linux uart fifo)

在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时需要注意的一些问题。希望本文对各位读者有所帮助。

相关问题拓展阅读:

Linux C 配置串口

配置串口需要包含

头文件

其中最核心的配置

结构体

为:

如何获取该结构呢?我们操作串口跟操作文件一样,也是调用 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 配置串口的信息别忘了在本站进行查找喔。


数据运维技术 » Linux下UART FIFO的使用 (linux uart fifo)