真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Linux串口IO模式的心得有哪些呢

Linux串口IO模式的心得有哪些呢,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

成都創(chuàng)新互聯(lián),是一家集策劃、設(shè)計(jì)、技術(shù)開發(fā)一體的專業(yè)互聯(lián)網(wǎng)產(chǎn)品服務(wù)公司,致力于為企業(yè)信息化提供驅(qū)動(dòng)力。技術(shù)團(tuán)隊(duì)十年來致力于為客戶提供企業(yè)網(wǎng)站定制,移動(dòng)網(wǎng)站建設(shè)。先后服務(wù)了上千多家客戶,包括各類中小企業(yè)、高校、政府。 成都創(chuàng)新互聯(lián)將利用公司在過去十年的資源積累,力爭為客戶打造真正革命性的口碑產(chǎn)品!

眾所周知,在Linux系統(tǒng)下所有設(shè)備都是以文件的形式存在,串口也一樣。

通常I/O操作都是有阻塞與非阻塞的兩種方式。

其中"超時(shí)"這個(gè)概念其實(shí)是阻塞中的一種處理手段,本質(zhì)還是屬于阻塞的I/O模式.

在Linux中串口的IO操作 本文將它分為三種狀態(tài):

  • 阻塞狀態(tài)

  • 超時(shí)狀態(tài)

  • 非阻塞狀態(tài)

這三種狀態(tài)的轉(zhuǎn)換組合有這么幾種:

  • 阻塞 --> 超時(shí)

  • 阻塞 --> 非阻塞

  • 超時(shí) --> 阻塞

  • 超時(shí) --> 非阻塞

  • 非阻塞 --> 阻塞

我們一個(gè)一個(gè)來分析

首先在一個(gè)串口的描述符打開的時(shí)候指定它的模式是阻塞還是阻塞

fd = open("/dev/tttyS0",O_RDWR | O_NOCTTY);//以阻塞模式打開串口  fd = open("/dev/tttyS0",O_RDWR | O_NOCTTY | O_NDELAY);//以非阻塞模式打開串口  //O_NDELAY 等價(jià)于 O_NOBLOCK

當(dāng)一個(gè)串口是阻塞狀態(tài)的時(shí)候便可以設(shè)置它為超時(shí)狀態(tài)。

利用 struct termios 的 cc_t c_cc[NCCS] 成員

  • c_cc[VTIME] 非規(guī)范模式讀取時(shí)的超時(shí)時(shí)間(單位:百毫秒)

  • c_cc[VMIN] 非規(guī)范模式讀取時(shí)的最小字符數(shù)

如需需要設(shè)置超時(shí)則c_cc[VMIN] 必須等于0。這代表能夠讀取的最小字符是0個(gè),即使用read讀取數(shù)據(jù)超時(shí)read返回0

有一個(gè)需要注意的地方!

當(dāng)c_cc[VTIME] 設(shè)置為 0 且 c_cc[VMIN] == 0 的時(shí)候,代表超時(shí)0秒(姑且這么叫吧!)這個(gè)時(shí)候使用read讀取數(shù)據(jù)會(huì)立即返回(有讀到數(shù)據(jù)時(shí)返回字節(jié)數(shù),沒有數(shù)據(jù)和一般超時(shí)一樣返回0)但是,雖然這時(shí)候在現(xiàn)象上看起來和非阻塞模式一樣(read都不會(huì)阻塞)但返回值不同

非阻塞模式: read沒有讀到數(shù)據(jù)立即返回-1

超時(shí)0秒時(shí): read沒有讀到數(shù)據(jù)立即返回 0 (設(shè)置了超時(shí)的阻塞模式)

ret = read(fd,recvbuf,BUF_SIZE);  if(ret == -1)//非阻塞模式時(shí)"無數(shù)據(jù)返回"  {  //do something  }  ret = read(fd,recvbuf,BUF_SIZE);  if(ret == 0)//阻塞模式設(shè)置超時(shí)0秒時(shí)"超時(shí)返回"  {  //do something  }

雖然表現(xiàn)形式一樣,但在編程時(shí)必須要了解自己使用的是哪一種模式和串口當(dāng)前的狀態(tài)才能更好的分析和處理問題。

這里說一下我曾經(jīng)遇到過的一個(gè)問題:

我在打開串口時(shí)使用阻塞模式打開,但是沒有設(shè)置c_cc[VMIN]的值,而它初始化后就是0,所以發(fā)現(xiàn)串口沒有被阻塞,其實(shí)原因就是串口模式還是阻塞模式?jīng)]錯(cuò),但是它是超時(shí)0秒的狀態(tài),所以在沒有數(shù)據(jù)到達(dá)時(shí)read也返回了。

阻塞狀態(tài)和非阻塞狀態(tài)的切換

非阻塞狀態(tài)時(shí)使用

fcntl(fd,F_SETFL,0);

即可轉(zhuǎn)換成阻塞狀態(tài),同樣可以設(shè)置超時(shí)

當(dāng)非阻塞狀態(tài)已經(jīng)設(shè)置了超時(shí)時(shí),在轉(zhuǎn)換成阻塞狀態(tài)后超時(shí)也隨同生效

阻塞狀態(tài)時(shí)使用

fcntl(fd,F_SETFL,FNDELAY);  //FNDELAY等價(jià)于FNONBLOCK

即可轉(zhuǎn)換成非阻塞狀態(tài),超時(shí)失效

這里提一下 fcntl.h中幾個(gè)宏的定義

/* Define some more compatibility macros to be backward compatible with  BSD systems which did not managed to hide these kernel macros. */  #ifdef __USE_BSD  # define FAPPEND O_APPEND  # define FFSYNC O_FSYNC  # define FASYNC O_ASYNC  # define FNONBLOCK O_NONBLOCK  # define FNDELAY O_NDELAY  #endif /* Use BSD. */

現(xiàn)在一目了然了吧?打開串口時(shí)非阻塞模式的O_NDELAY或O_NONBLOCK選項(xiàng)

fcntl設(shè)置非阻塞模式的第3個(gè)參數(shù)FNDELAY或者FNONBLOCK 其實(shí)都是O_NONBLOCK主要就是為了兼容

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。


文章名稱:Linux串口IO模式的心得有哪些呢
鏈接分享:http://weahome.cn/article/igshhj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部