新聞中心
在Linux系統(tǒng)中,UART(Universal Asynchronous Receiver/Tranitter)是一個重要的設(shè)備,它是連接計算機和外部設(shè)備的橋梁,例如串行口,CAN總線等。而在與UART通信的過程中,數(shù)據(jù)的傳輸速度也是非常的關(guān)鍵。因此,在實際的應(yīng)用中,我們需要使用一些技巧來提高UART的傳輸效率,F(xiàn)IFO(First-In-First-Out)技術(shù)就是其中之一。FIFO指的是一個有限的隊列,先進入的數(shù)據(jù)首先被處理。在Linux系統(tǒng)中,通過使用UART FIFO,可以顯著提高UART的傳輸速度。那么,在本文中,我們將介紹如何在Linux系統(tǒng)下使用UART FIFO。

1. 什么是UART FIFO
在Linux系統(tǒng)中,UART FIFO是一個硬件上的緩存,用于存儲串行數(shù)據(jù)流從輸入輸出口進出串口控制器的數(shù)據(jù)。它是一個帶有記錄指針和數(shù)據(jù)緩存空間的緩存區(qū)。通常情況下,UART FIFO具有下列幾個特點:
– 有限的存儲空間
– 讀寫指針用于記錄FIFO緩沖區(qū)的狀態(tài)
– 數(shù)據(jù)按照輸入的先后順序存儲,因此讀出來的數(shù)據(jù)與寫入的順序相同(即先進先出)
使用UART FIFO可以顯著提高串口的數(shù)據(jù)處理速率,因為它可以在接收數(shù)據(jù)時緩存一定量的數(shù)據(jù),并在處理完成之后再將數(shù)據(jù)發(fā)送出去。
2. Linux下的UART FIFO
一般情況下,在Linux系統(tǒng)中,UART設(shè)備驅(qū)動程序是由串口控制器的芯片提供的,例如常見的串口芯片8250或16550等。而對于Linux系統(tǒng)來說,支持UART FIFO的串口驅(qū)動程序通常為serial_core.c/serial8250.c。同時,在Linux系統(tǒng)中,也提供了一系列的API和函數(shù),用于操作和控制UART FIFO。
2.1. 串口設(shè)備文件
在Linux系統(tǒng)中,每個串口設(shè)備都有一個特定的設(shè)備文件,例如/dev/ttyS0、/dev/ttyS1等。當(dāng)一個進程需要與串口通信時,需要通過打開該設(shè)備文件來建立與串口的連接。之后,該進程便可以通過讀取和寫入該設(shè)備文件來實現(xiàn)與串口的數(shù)據(jù)交換。
2.2. 使用UART FIFO
在Linux系統(tǒng)下,使用UART FIFO需要使用一系列的API和函數(shù),例如tty_struct、tty_termios、serial8250_driver等。下面,我們將簡要介紹如何使用UART FIFO:
2.2.1. 初始化UART FIFO
在使用UART FIFO之前,需要對其進行初始化。對于8250/16550等常見的串口芯片,可以通過調(diào)用serial8250_init_port函數(shù)進行初始化。該函數(shù)的原型為:
int serial8250_init_port(struct uart_port *port);
其中,uart_port是描述串口設(shè)備的結(jié)構(gòu)體。
2.2.2. 開啟UART FIFO
在初始化UART FIFO之后,需要通過調(diào)用serial8250_set_termios函數(shù)開啟UART FIFO功能。該函數(shù)的原型為:
int serial8250_set_termios(struct uart_port *port, struct ktermios *termios, struct ktermios *old);
其中,ktermios是終端設(shè)置結(jié)構(gòu)體,保存UART設(shè)備的所有設(shè)置,例如波特率、奇偶校驗等。
2.2.3. 讀取UART FIFO數(shù)據(jù)
在讀取UART FIFO數(shù)據(jù)時,可以調(diào)用tty_read函數(shù)。該函數(shù)原型為:
static ssize_t tty_read(struct file *file, char *buf, size_t count, loff_t *ppos);
其中:file表示要讀取的設(shè)備文件,buf表示緩存區(qū),count表示讀取的字節(jié)數(shù)。
2.2.4. 寫入UART FIFO數(shù)據(jù)
在寫入UART FIFO數(shù)據(jù)時,可以調(diào)用tty_write函數(shù)。該函數(shù)原型為:
static ssize_t tty_write(struct file *file, const char *buf, size_t count, loff_t *ppos);
其中:file表示要寫入的設(shè)備文件,buf表示數(shù)據(jù)緩存區(qū),count表示寫入的字節(jié)數(shù)。
3. 使用UART FIFO的注意事項
在使用UART FIFO時,需要注意以下幾點:
3.1. 開啟UART FIFO需要滿足一些條件,例如:波特率、數(shù)據(jù)位、停止位等應(yīng)該與外設(shè)一致。
3.2. 在接收數(shù)據(jù)時,需要設(shè)置一個合適的FIFO緩存。如果緩存太小,會丟失數(shù)據(jù);如果緩存太大,會浪費內(nèi)存。通常情況下,緩存的大小可以根據(jù)應(yīng)用需求確定。例如,當(dāng)需要讀取大量的數(shù)據(jù)時,可以增大FIFO的緩存。
3.3. 由于UART FIFO在串口傳輸時存在一定的延遲,因此在發(fā)送、接收數(shù)據(jù)時需要設(shè)置合適的超時時間,以保證數(shù)據(jù)的正確傳輸??梢酝ㄟ^調(diào)用tty_set_termios函數(shù),設(shè)置超時時間。
4.
在Linux系統(tǒng)中,UART FIFO是一個用于提高串口數(shù)據(jù)處理速度的非常重要的技術(shù)。使用UART FIFO,可以在發(fā)送和接收數(shù)據(jù)時同時處理多個數(shù)據(jù),從而提高串口傳輸?shù)男省Mㄟ^本文的介紹,我們了解了在Linux系統(tǒng)中使用UART FIFO的一些基本概念、API和函數(shù),也了解了使用UART FIFO時需要注意的一些問題。希望本文對各位讀者有所幫助。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁設(shè)計及定制高端網(wǎng)站建設(shè)服務(wù)!
Linux C 配置串口
配置串口需要包含
頭文件
其中最核心的配置
結(jié)構(gòu)體
為:
如何獲取該結(jié)構(gòu)呢?我們操作串口跟操作文件一樣,也是調(diào)用 open() 函數(shù)來打開串口,
這樣我們就能夠得到一個
文件描述符
fd ,然后就可以調(diào)用 tcgetattr() 函數(shù)來獲取上述配置結(jié)構(gòu)體了。
Linux 串口默認的配置為:
波特率
9600,數(shù)據(jù)位 8 位,無
奇偶校驗
,停止位 1 位,無 CTS/RTS 。
以下介紹一些常用的配置項:波特率、奇偶校驗、數(shù)據(jù)位、停止位、硬件控制流。
相關(guān)接口:
Linux 將串口的波特率辯笑分為了輸入波特率和輸出波特率,不過最常用的場景是將兩者設(shè)置成一樣。
cfgetispeed() 函數(shù)獲取輸入波特率, cfgetospeed() 函數(shù)獲取輸出波特率。 cfsetispeed() 函數(shù)設(shè)置輸入波特率, cfsetospeed() 函數(shù)用于設(shè)置輸如掘出波特率,當(dāng)然 cfsetspeed() 函數(shù)擴展為同時設(shè)置輸入和輸出波特率。
上述接口中的 speed_t 是一系列波特率的標(biāo)志位,例如常用的波特率就為 B115200,參考下述選項:
設(shè)置奇渣灶核偶校驗位可以通過修改 termios 結(jié)構(gòu)體中的 c_cflag 成員來實現(xiàn),若無校驗,則將 PARENB 位設(shè)為 0;若有校驗,則 PARENB 為 1。之后再根據(jù) PARODD 來區(qū)分奇偶校驗, PARODD 為 1 表示奇校驗, PARODD 為 0 表示偶校驗。例如設(shè)置無奇偶校驗位:
設(shè)置數(shù)據(jù)位可以通過修改 termios 結(jié)構(gòu)體中的 c_cflag 成員來實現(xiàn),CS5、CS6、CS7 和 CS8 分別代表數(shù)據(jù)位 5、6、7 和 8。不過在設(shè)置數(shù)據(jù)位之前,需要先用 CSIZE 來做屏蔽字段,清楚這幾個標(biāo)志位,例如設(shè)置數(shù)據(jù)位為 8 位:
設(shè)置停止位可以通過修改 termios 結(jié)構(gòu)體中的 c_cflag 成員來實現(xiàn), CSTOPB 位為 1 表示 2 位停止位, CSTOPB 位為 0 標(biāo)志 1 位停止位。例如設(shè)置停止位為 1 位:
設(shè)置硬件控制流可以通過修改 termios 結(jié)構(gòu)體中的 c_cflag 成員來實現(xiàn), CRTSCTS 為 1 表示使用硬件控制流,為 0 表示不使用硬件控制流。例如
使能
硬件控制流:
當(dāng)然,最后還需要用 tcflush() 拋棄存儲在 fd 里的未接收的數(shù)據(jù)。
再利用接口 tcsetattr() 函數(shù)將配置信息寫入文件描述符 fd :
這樣整個串口最常用的用法就配置完成了。
具體的配置使用可以參考我的項目 HCI-Middleware 里的 hci_transport_uart_linux.c 文件。
參考:
linux uart fifo的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux uart fifo,Linux下UART FIFO的使用,Linux C 配置串口的信息別忘了在本站進行查找喔。
創(chuàng)新互聯(lián)-老牌IDC、云計算及IT信息化服務(wù)領(lǐng)域的服務(wù)供應(yīng)商,業(yè)務(wù)涵蓋IDC(互聯(lián)網(wǎng)數(shù)據(jù)中心)服務(wù)、云計算服務(wù)、IT信息化、AI算力租賃平臺(智算云),軟件開發(fā),網(wǎng)站建設(shè),咨詢熱線:028-86922220
網(wǎng)頁標(biāo)題:Linux下UARTFIFO的使用(linuxuartfifo)
瀏覽路徑:http://www.dlmjj.cn/article/dpsjgpd.html


咨詢
建站咨詢
