日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Linux串口打開:阻塞與非阻塞模式簡(jiǎn)介(linux串口打開阻塞和非阻塞方式)

Linux是一種開源的操作系統(tǒng),具有穩(wěn)定性高、安全性好、容錯(cuò)性強(qiáng)且可定制性強(qiáng)等優(yōu)點(diǎn)。在Linux系統(tǒng)中,串口的開發(fā)也占有重要的地位。串口可以用來(lái)連接外部設(shè)備和主機(jī),比如燒寫單片機(jī)、控制硬件等操作。而Linux系統(tǒng)能夠支持多種串口編程模式,包括阻塞和非阻塞模式。在此文中,我們將介紹這兩種串口模式的不同之處以及它們?cè)趯?shí)際應(yīng)用中的使用。

一、串口基礎(chǔ)知識(shí)

串口(Serial Port)是一種用于連接計(jì)算機(jī)外部設(shè)備的接口。通常又被稱作RS-232C接口。串口是無(wú)需額外硬件控制器的簡(jiǎn)單通信接口。其常見參數(shù)包括數(shù)據(jù)位數(shù)、奇偶校驗(yàn)、流控制等,以達(dá)到串行通訊過程中的正確傳輸數(shù)據(jù)的目的 。一個(gè)傳輸數(shù)據(jù)的端口擁有兩根數(shù)據(jù)線,分別是發(fā)送(TxD)和接收(RxD)。

在Linux中,可以通過終端來(lái)訪問串口。通常在Linux系統(tǒng)默認(rèn)安裝了兩個(gè)終端,一個(gè)是控制臺(tái)(tty0-tty6),另一個(gè)是終端(tty)。

二、阻塞模式

在阻塞模式下,讀寫串口將會(huì)被阻塞。這意味著當(dāng)串口上沒有數(shù)據(jù)時(shí),讀取阻塞函數(shù)將會(huì)一直等待,直到收到數(shù)據(jù)。同理,在寫入串口時(shí),寫函數(shù)也將會(huì)一直阻塞,直到所有數(shù)據(jù)被寫入到串口緩沖區(qū)中。

阻塞模式的優(yōu)點(diǎn)在于它非常簡(jiǎn)單易懂。即使代碼分布在不同的地方,也可以保證讀寫串口的同步性。然而,這種方式的缺點(diǎn)在于當(dāng)多個(gè)線程都試圖讀取或者寫入串口時(shí),這些請(qǐng)求將會(huì)一直被阻塞,從而導(dǎo)致資源的浪費(fèi)。

阻塞模式的代碼實(shí)現(xiàn)方法與打開一個(gè)普通的文件類似??梢酝ㄟ^Linux中的open()函數(shù)打開串口設(shè)備文件,然后用read() 和write()函數(shù)來(lái)分別讀取和寫入串口數(shù)據(jù)。

三、非阻塞模式

同樣地,在非阻塞模式下,讀寫操作不會(huì)被允許直接阻塞。如果串口上沒有數(shù)據(jù)可讀,那么讀操作將立即返回EAGN錯(cuò)誤。寫操作也是如此,如果寫緩沖區(qū)已滿,那么寫操作將立即返回EAGN 錯(cuò)誤。

非阻塞模式的優(yōu)點(diǎn)在于,當(dāng)需要多個(gè)串口請(qǐng)求處理時(shí),它能夠充分利用進(jìn)程的任務(wù)并行執(zhí)行。并且,非阻塞模式能夠在高并發(fā)訪問時(shí)有效避免死鎖的問題。但是,它同時(shí)也不是很好維護(hù),需要一些額外的處理操作。

在非阻塞模式下,需要使用poll()和select()等函數(shù)進(jìn)行輪詢。這些函數(shù)會(huì)等待數(shù)據(jù)可讀或者可寫,并在可讀可寫的時(shí)候通知程序。

四、阻塞和非阻塞模式的比較

阻塞模式與非阻塞模式的比較如下:

阻塞模式:同步方式,可靠性高,但缺乏靈活性和處理能力,當(dāng)有多個(gè)串口需要處理時(shí),會(huì)產(chǎn)生大量的等待時(shí)間,并且會(huì)消耗大量的CPU資源。

非阻塞模式:異步方式,具有更高的并發(fā)性和處理能力,但其可靠性往往不如阻塞模式。

圖形化的比較:

阻塞模式 非阻塞模式

同步方式 異步方式

可靠性高 可靠性相對(duì)低

缺乏靈活性 更高的并發(fā)性和處理能力

會(huì)消耗大量的CPU資源 更好在高并況下使用

五、結(jié)論

在串口編程中,阻塞和非阻塞模式是兩種常見的實(shí)現(xiàn)方式。阻塞模式具有可靠性高的特點(diǎn),但是不適合在高并況下使用。相較于阻塞模式,非阻塞模式充分利用了系統(tǒng)的處理能力,但是因其“異步”所以其可靠性相對(duì)較低。在實(shí)際應(yīng)用中,開發(fā)人員應(yīng)根據(jù)具體情況去選擇一種合適的模式。同時(shí),選擇適當(dāng)?shù)妮喸兎绞揭彩潜WC系統(tǒng)穩(wěn)定的關(guān)鍵,開發(fā)人員需要充分了解每種輪詢方式的特點(diǎn)。

相關(guān)問題拓展閱讀:

  • 各位大俠,我寫了一個(gè)linux下我寫了個(gè)程序驗(yàn)證串口接收數(shù)據(jù)情況,是個(gè)死循環(huán)read,發(fā)現(xiàn)串口需要分多次read

各位大俠,我寫了一個(gè)linux下我寫了個(gè)程序驗(yàn)證串口接收數(shù)據(jù)情況,是個(gè)死循環(huán)read,發(fā)現(xiàn)串口需要分多次read

將串口打開模式設(shè)為非阻塞模式,用多線程實(shí)現(xiàn).

首先,默認(rèn)的串口文件的緩存方式型猜是無(wú)緩沖。其次,串口在發(fā)送數(shù)據(jù)的時(shí)候不是連續(xù)的。

比如,串口要給你0x62,0x77。那么他就先發(fā)0x62后發(fā)0x77。而如果你在他發(fā)完0x62的時(shí)候馬上就read()那就會(huì)只得到0x62.而0x77要再read一次。

如果你想一次就全讀上來(lái),那有兩個(gè)方法。宴兄

1:你自己寫一個(gè)讀串口的函數(shù),里面調(diào)用read;

例如:

int tipc_read_socket( int sockfd, char *buf, int len )

{

int count = 0; //每次讀取字節(jié)數(shù)

int pos = 0; //總共讀取字節(jié)數(shù)

pos = 0;

do {

count = read(sockfd, &buf, len – pos);

//printf(“tipc_read_socket:count\n”, count);

if( 0 > count )

{

if( EINTR == errno )

continue;

//當(dāng)設(shè)置為non block的時(shí)候,之一次把所有的數(shù)晌租襲據(jù)讀取完以后,第二次的結(jié)果為-1.

return( pos );

}

if( 0 == count ) break; /* Nothing left! */

pos += count;

} while( len > pos );

return( pos );}

2:你設(shè)置一下輸入輸出屬性。

struct termios newtio;

bzero( &newtio, sizeof( newtio ) );

newtio.c_cc = ***;

newtio.c_cc = ***;

tcsetattr(fd,TCSANOW,&newtio);

這個(gè)里面的VTIME,VMIN。就是讀等待的時(shí)間。

設(shè)置了以后,比如你讀0x62的時(shí)候read,那么他會(huì)等待你設(shè)置的時(shí)間,如果在這個(gè)時(shí)間里面0x77來(lái)了,那他會(huì)把0x62和0x77一起返回給你。這個(gè)時(shí)間跟波特率有關(guān),應(yīng)該是設(shè)置為在某種波特率的情況下連續(xù)兩字節(jié)的更大間隔時(shí)間。

你read給的參數(shù)是什么?

成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)成都老牌IDC服務(wù)商,專注四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,可選線路電信、移動(dòng)、聯(lián)通等。


當(dāng)前文章:Linux串口打開:阻塞與非阻塞模式簡(jiǎn)介(linux串口打開阻塞和非阻塞方式)
文章來(lái)源:http://www.dlmjj.cn/article/cohgosd.html