新聞中心
在嵌入式系統(tǒng)中,串口通信是最常用的方式之一。在Linux系統(tǒng)中,串口通信的實(shí)現(xiàn)需要通過(guò)操作串口緩沖區(qū)進(jìn)行數(shù)據(jù)傳輸。然而,由于串口緩沖區(qū)的特殊性質(zhì),數(shù)據(jù)傳輸時(shí)會(huì)出現(xiàn)一些問(wèn)題,如傳輸數(shù)據(jù)的丟失或延遲。因此,針對(duì)這些問(wèn)題,我們需要優(yōu)化串口緩沖區(qū)的操作,以獲得更快、更穩(wěn)定的數(shù)據(jù)傳輸。

創(chuàng)新互聯(lián)是一家集成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站頁(yè)面設(shè)計(jì)、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)的建站公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗(yàn),以探求精品塑造與理念升華,設(shè)計(jì)最適合用戶的網(wǎng)站頁(yè)面。 合作只是第一步,服務(wù)才是根本,我們始終堅(jiān)持講誠(chéng)信,負(fù)責(zé)任的原則,為您進(jìn)行細(xì)心、貼心、認(rèn)真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場(chǎng)環(huán)境中,互促共生。
1. 串口緩沖區(qū)介紹
在Linux系統(tǒng)中,串口緩沖區(qū)分為發(fā)送緩沖區(qū)和接收緩沖區(qū)。發(fā)送緩沖區(qū)用于存儲(chǔ)要發(fā)送的數(shù)據(jù),而接收緩沖區(qū)則用于接收數(shù)據(jù)。每個(gè)緩沖區(qū)都有自己的大小限制。如果緩沖區(qū)溢出,將會(huì)有一些數(shù)據(jù)被丟棄。
Linux系統(tǒng)中的串口緩沖區(qū)是由內(nèi)核維護(hù)的,因此對(duì)其操作需要經(jīng)過(guò)內(nèi)核。對(duì)于發(fā)送數(shù)據(jù),我們可以使用write()系統(tǒng)調(diào)用向發(fā)送緩沖區(qū)中寫(xiě)入數(shù)據(jù)。對(duì)于接收數(shù)據(jù),我們可以使用read()系統(tǒng)調(diào)用從接收緩沖區(qū)中讀取數(shù)據(jù)。
2. 優(yōu)化串口緩沖區(qū)的操作
對(duì)于串口緩沖區(qū)的操作,需要注意以下幾個(gè)方面:
2.1. 確保緩沖區(qū)的容量
在進(jìn)行串口通信時(shí)我們需要考慮到數(shù)據(jù)傳輸?shù)耐暾浴H绻彌_區(qū)的容量過(guò)小,就容易發(fā)生緩沖區(qū)溢出的情況,導(dǎo)致部分?jǐn)?shù)據(jù)丟失。因此,我們需要確定較為合理的緩沖區(qū)大小。在實(shí)際應(yīng)用中,我們需要選擇合適的緩沖區(qū)大小,以容納數(shù)據(jù)并避免緩沖區(qū)溢出。
2.2. 控制數(shù)據(jù)的傳輸速率
由于串口通信過(guò)程中由于數(shù)據(jù)的傳輸速率跟不上處理速度,導(dǎo)致數(shù)據(jù)積壓在緩沖區(qū)內(nèi),從而使得數(shù)據(jù)鏈路中的延遲和數(shù)據(jù)的丟失更加普遍。因此,我們需要在數(shù)據(jù)的傳輸速率和處理速率之間進(jìn)行折中。對(duì)于數(shù)據(jù)的傳輸速率,我們可以使用Linux系統(tǒng)中的tcsetpgrp()函數(shù)來(lái)實(shí)現(xiàn)。該函數(shù)可以使用一定的算法來(lái)控制發(fā)送和接收數(shù)據(jù)的速率,從而避免數(shù)據(jù)的積壓和丟失情況。
2.3. 及時(shí)傳輸數(shù)據(jù)
串口通信的數(shù)據(jù)傳輸是一種實(shí)時(shí)性的操作。因此,我們需要及時(shí)傳輸數(shù)據(jù),在數(shù)據(jù)被緩沖之前就立即進(jìn)行發(fā)送。如果數(shù)據(jù)長(zhǎng)時(shí)間的滯留在緩沖區(qū)中,會(huì)對(duì)實(shí)時(shí)性要求比較高的應(yīng)用產(chǎn)生影響。因此,我們需要及時(shí)處理串口緩沖區(qū)中的數(shù)據(jù),以避免延遲。
2.4. 對(duì)于丟失數(shù)據(jù)的處理
在數(shù)據(jù)傳輸過(guò)程中,如果數(shù)據(jù)的大小超出了緩沖區(qū)的容量,將會(huì)出現(xiàn)數(shù)據(jù)丟失的情況。在應(yīng)用中,我們需要對(duì)于這種情況進(jìn)行處理。對(duì)于接收數(shù)據(jù),我們可以使用select()等函數(shù)來(lái)確定是否有數(shù)據(jù)可以被讀取,以避免潛在的數(shù)據(jù)丟失情況。
3.
在Linux系統(tǒng)中,串口緩沖區(qū)是實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)闹匾M成部分。在進(jìn)行適當(dāng)?shù)牟僮髦螅梢源蟠筇岣叽谕ㄐ诺姆€(wěn)定性和實(shí)時(shí)性。為此,我們需要確定合適的緩沖區(qū)大小,并控制數(shù)據(jù)的傳輸速率、及時(shí)傳輸數(shù)據(jù)以及對(duì)于數(shù)據(jù)丟失情況進(jìn)行及時(shí)的處理。
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián)為您提供網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù)!
linux串口編程(termios)相關(guān)的使用問(wèn)題
struct termios state; ==》終端屬性變量
tcgetattr (STDIN_FILENO, &state); ==》獲取當(dāng)前終端屬性
state.c_iflag &= ~(ICRNL | INPCK | ISTRIP | BRKINT); ==》
state.c_iflag |= IXON;
state.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
state.c_oflag &= ~OPOST;
state.c_cflag |= CS8;
state.c_cflag |= CREAD;
state.c_cc = 1;
state.c_cc = 0;
======》以上內(nèi)容是對(duì)終端屬性的一個(gè)修改,貌似少旦攜了對(duì)終端睜遲搭波特率的設(shè)置
具體終端屬性 給你個(gè)鏈悉拿接吧,里有詳細(xì)說(shuō)明
你好樓主,前一陣正好研究了一下linux串口編程,苦惱了一陣,不過(guò)總算弄通了,下面說(shuō)一下我的思路和理解。
struct termios state; 這是一個(gè)設(shè)計(jì)到串口屬性的結(jié)構(gòu)體,通過(guò)給結(jié)構(gòu)體內(nèi)的屬性賦值來(lái)設(shè)計(jì)串口
的一些屬性。
tcgetattr (STDIN_FILENO, &state); 這是獲取當(dāng)如沒(méi)前的串口的屬性,并賦給STDIN_FILENO這個(gè)設(shè)
備。計(jì)算機(jī)中已定義STDIN_FILENO這是一個(gè)標(biāo)準(zhǔn)輸入的設(shè)
備,通常是寫(xiě)在屏幕上(就是在屏幕上顯示)。如樓主所說(shuō)
的A與B相連,可能就是從A寫(xiě)到B了。
=====下面是重新給串口的結(jié)構(gòu)體的屬性賦值,以達(dá)到自己想設(shè)計(jì)一個(gè)什么功能的串晌橡寬口========
state.c_iflag &= ~(ICRNL | INPCK | ISTRIP | BRKINT); c_iflag是控制輸入屬性的標(biāo)志位,打個(gè)比
方,c_iflag原來(lái)是111,ICRNL代表001 ,ICRNL代表010,ISTRIP代表100,這三
個(gè)常量按位或ICRNL | INPCK | ISTRIP 得出的結(jié)果就是111 然后再取 ~(非)符號(hào)
得的結(jié)果就是 000。就代表最終c_iflag的值是000。然后計(jì)算機(jī)就會(huì)根據(jù)這一竄二
進(jìn)制的數(shù)字來(lái)判斷輸入的到底是什么屬性。向ICRNL 這些常量的值都是在計(jì)算機(jī)
中已經(jīng)定義好的了。但是字符串的位數(shù)要比我舉例子的要多,我只是說(shuō)了個(gè)大概的
意思。 下面我說(shuō)一下上面?zhèn)€參數(shù)的意思。
ICRNL 代表將輸入中的回車換為新行。
INPCK 代表啟用奇偶校驗(yàn)。
ISTRIP 代表去掉第八位,(就是傳輸是只傳7位)宴亮
BRKINT 代表 如果設(shè)置了IGNBRK,將忽略BREAK。如果沒(méi)有設(shè)置,但是設(shè)置了
BRKINT,那么BREAK將使得輸入和輸出隊(duì)列被刷新(影響應(yīng)該不大)
state.c_iflag |= IXON;IXON 表示可以用ctrl-s暫停輸出 。
state.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
c_lflag 代表本地屬性(local),原理同上,下面介紹下個(gè)參數(shù)的用意。
ICANON代表允許一些特殊字符以及按行緩沖。
IEXTEN 當(dāng)設(shè)置 時(shí)可被識(shí)別,不再作為輸入傳遞。
ISIG 代表當(dāng)接收到INTR QUIT SUSR 或 DSUSP時(shí)產(chǎn)生信號(hào)。
ECHO 顯示輸入字符。
state.c_oflag &= ~OPOST; c_oflag 代表輸出控制標(biāo)志位。
OPOST 代表程序可以選擇加工過(guò)的輸入
state.c_cflag |= CS8;c_cflag 代表控制標(biāo)志位(ctrl)
CS8代表字符長(zhǎng)度掩碼是8為,(如會(huì)看到串口一些數(shù)據(jù)
“n-1” 代表頻率9600,字符長(zhǎng)度8位,無(wú)奇偶校驗(yàn),一
位停止位)。
state.c_cflag |= CREAD;CREAD代表設(shè)置接受使能。
state.c_cc = 1;代表非常規(guī)模式下讀的最小的字符數(shù)。
state.c_cc = 0;代表非常規(guī)模式下讀的最小延遲。
==========================================================================
tcsetattr (STDIN_FILENO, TCSAFLUSH, &state); 這是把剛才設(shè)置好的屬性又賦值給
STDIN_FILENO這個(gè)設(shè)備。
TCSAFLUSH代表當(dāng)清空輸入輸出緩沖區(qū)時(shí)
才改變。
以上是我的看法,希望這些對(duì)你有幫助, 歡迎有問(wèn)題與我交流。
struct termios state; ==》終端屬性變量
tcgetattr (STDIN_FILENO, &state); ==》獲取當(dāng)前終端屬性
state.c_iflag &= ~(ICRNL | INPCK | ISTRIP | BRKINT); ==》寬螞
state.c_iflag |= IXON;
state.c_lflag &= ~(ICANON | IEXTEN | ISIG | ECHO);
state.c_oflag &= ~OPOST;
state.c_cflag |= CS8;
state.c_cflag |= CREAD;
state.c_cc = 1;
state.c_cc = 0;
======》以上內(nèi)容是對(duì)終端屬性的一個(gè)修改,貌似少了對(duì)終端波特率的設(shè)置
具體終端屬性 給你個(gè)鏈接吧,里有詳細(xì)尺孝說(shuō)明
tcsetattr (STDIN_FILENO, TCSAFLUSH, &state); ==》設(shè)置當(dāng)前設(shè)置慎困埋的終端屬性
希望幫得到你~
樓下的您太赤果果了吧~
linux下串口發(fā)送無(wú)符號(hào)數(shù)據(jù),超過(guò)127,貌似溢出,什么原因?如何解決
變量類型應(yīng)為short型
Linux C 配置串口
配置串口需要包含
頭文件
其中最核心的配置
結(jié)構(gòu)體
為:
如何獲取該結(jié)構(gòu)呢?我們操作串口跟操作文件一樣,也是調(diào)用 open() 函數(shù)來(lái)打開(kāi)串口,
這樣我們就能夠得到一個(gè)
文件描述符
fd ,然后就可以調(diào)用 tcgetattr() 函數(shù)來(lái)獲取上述配置結(jié)構(gòu)體了。
Linux 串口默認(rèn)的配置為:
波特率
9600,數(shù)據(jù)位 8 位,無(wú)
奇偶校驗(yàn)
,停止位 1 位,無(wú) CTS/RTS 。
以下介紹一些常用的配置項(xiàng):波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位、硬件控制流。
相關(guān)接口:
Linux 將串口的波特率辯笑分為了輸入波特率和輸出波特率,不過(guò)最常用的場(chǎng)景是將兩者設(shè)置成一樣。
cfgetispeed() 函數(shù)獲取輸入波特率, cfgetospeed() 函數(shù)獲取輸出波特率。 cfsetispeed() 函數(shù)設(shè)置輸入波特率, cfsetospeed() 函數(shù)用于設(shè)置輸如掘出波特率,當(dāng)然 cfsetspeed() 函數(shù)擴(kuò)展為同時(shí)設(shè)置輸入和輸出波特率。
上述接口中的 speed_t 是一系列波特率的標(biāo)志位,例如常用的波特率就為 B115200,參考下述選項(xiàng):
設(shè)置奇渣灶核偶校驗(yàn)位可以通過(guò)修改 termios 結(jié)構(gòu)體中的 c_cflag 成員來(lái)實(shí)現(xiàn),若無(wú)校驗(yàn),則將 PARENB 位設(shè)為 0;若有校驗(yàn),則 PARENB 為 1。之后再根據(jù) PARODD 來(lái)區(qū)分奇偶校驗(yàn), PARODD 為 1 表示奇校驗(yàn), PARODD 為 0 表示偶校驗(yàn)。例如設(shè)置無(wú)奇偶校驗(yàn)位:
設(shè)置數(shù)據(jù)位可以通過(guò)修改 termios 結(jié)構(gòu)體中的 c_cflag 成員來(lái)實(shí)現(xiàn),CS5、CS6、CS7 和 CS8 分別代表數(shù)據(jù)位 5、6、7 和 8。不過(guò)在設(shè)置數(shù)據(jù)位之前,需要先用 CSIZE 來(lái)做屏蔽字段,清楚這幾個(gè)標(biāo)志位,例如設(shè)置數(shù)據(jù)位為 8 位:
設(shè)置停止位可以通過(guò)修改 termios 結(jié)構(gòu)體中的 c_cflag 成員來(lái)實(shí)現(xiàn), CSTOPB 位為 1 表示 2 位停止位, CSTOPB 位為 0 標(biāo)志 1 位停止位。例如設(shè)置停止位為 1 位:
設(shè)置硬件控制流可以通過(guò)修改 termios 結(jié)構(gòu)體中的 c_cflag 成員來(lái)實(shí)現(xiàn), CRTSCTS 為 1 表示使用硬件控制流,為 0 表示不使用硬件控制流。例如
使能
硬件控制流:
當(dāng)然,最后還需要用 tcflush() 拋棄存儲(chǔ)在 fd 里的未接收的數(shù)據(jù)。
再利用接口 tcsetattr() 函數(shù)將配置信息寫(xiě)入文件描述符 fd :
這樣整個(gè)串口最常用的用法就配置完成了。
具體的配置使用可以參考我的項(xiàng)目 HCI-Middleware 里的 hci_transport_uart_linux.c 文件。
參考:
linux 串口 緩沖區(qū)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 串口 緩沖區(qū),Linux串口緩沖區(qū):如何優(yōu)化數(shù)據(jù)傳輸?,linux串口編程(termios)相關(guān)的使用問(wèn)題,linux下串口發(fā)送無(wú)符號(hào)數(shù)據(jù),超過(guò)127,貌似溢出,什么原因?如何解決,Linux C 配置串口的信息別忘了在本站進(jìn)行查找喔。
香港云服務(wù)器機(jī)房,創(chuàng)新互聯(lián)(www.cdcxhl.com)專業(yè)云服務(wù)器廠商,回大陸優(yōu)化帶寬,安全/穩(wěn)定/低延遲.創(chuàng)新互聯(lián)助力企業(yè)出海業(yè)務(wù),提供一站式解決方案。香港服務(wù)器-免備案低延遲-雙向CN2+BGP極速互訪!
網(wǎng)站名稱:Linux串口緩沖區(qū):如何優(yōu)化數(shù)據(jù)傳輸?(linux串口緩沖區(qū))
標(biāo)題網(wǎng)址:http://m.5511xx.com/article/dhojeds.html


咨詢
建站咨詢
