成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux串口IO模式的一些心得

系統 Linux
眾所周知,在Linux系統下所有設備都是以文件的形式存在,串口也一樣。通常I/O操作都是有阻塞與非阻塞的兩種方式……

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

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

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

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

  • 阻塞狀態
  • 超時狀態
  • 非阻塞狀態

這三種狀態的轉換組合有這么幾種:

  • 阻塞 --> 超時
  • 阻塞 --> 非阻塞
  • 超時 --> 阻塞
  • 超時 --> 非阻塞
  • 非阻塞 --> 阻塞

我們一個一個來分析

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

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

當一個串口是阻塞狀態的時候便可以設置它為超時狀態。

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

  • c_cc[VTIME] 非規范模式讀取時的超時時間(單位:百毫秒)
  • c_cc[VMIN] 非規范模式讀取時的最小字符數

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

有一個需要注意的地方!

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

非阻塞模式: read沒有讀到數據立即返回-1

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

  1. ret = read(fd,recvbuf,BUF_SIZE);  
  2. if(ret == -1)//非阻塞模式時"無數據返回"  
  3. {  
  4. //do something  
  5. }  
  6. ret = read(fd,recvbuf,BUF_SIZE);  
  7. if(ret == 0)//阻塞模式設置超時0秒時"超時返回"  
  8. {  
  9. //do something  

雖然表現形式一樣,但在編程時必須要了解自己使用的是哪一種模式和串口當前的狀態才能更好的分析和處理問題。

這里說一下我曾經遇到過的一個問題:

我在打開串口時使用阻塞模式打開,但是沒有設置c_cc[VMIN]的值,而它初始化后就是0,所以發現串口沒有被阻塞,其實原因就是串口模式還是阻塞模式沒錯,但是它是超時0秒的狀態,所以在沒有數據到達時read也返回了。

阻塞狀態和非阻塞狀態的切換

非阻塞狀態時使用

  1. fcntl(fd,F_SETFL,0); 

即可轉換成阻塞狀態,同樣可以設置超時

當非阻塞狀態已經設置了超時時,在轉換成阻塞狀態后超時也隨同生效

阻塞狀態時使用

  1. fcntl(fd,F_SETFL,FNDELAY);  
  2. //FNDELAY等價于FNONBLOCK 

即可轉換成非阻塞狀態,超時失效

這里提一下 fcntl.h中幾個宏的定義

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

現在一目了然了吧?打開串口時非阻塞模式的O_NDELAY或O_NONBLOCK選項

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

原文鏈接:http://my.oschina.net/mlgb/blog/300925

責任編輯:牛小雨 來源: 等燈等燈的博客
相關推薦

2009-09-27 11:09:42

API設計

2011-09-19 10:15:10

移動界面設計

2021-10-13 07:48:23

Options模式編程

2011-06-16 20:35:34

SEO

2010-05-28 14:44:42

Linux開發工具

2019-08-19 14:56:07

設計模式javascript

2009-11-25 10:08:41

Cisco無線路由

2017-04-08 17:12:36

設計模式抽象策略模式

2021-05-21 11:20:36

Linux命令文件

2025-05-09 09:10:00

2022-02-17 13:58:38

Linux技巧文件

2013-08-26 14:58:48

App Store關鍵字優化App營銷

2012-06-15 09:41:40

Linux內核

2024-03-11 15:08:26

Linux操作系統進程

2023-04-17 08:21:42

2015-08-17 15:53:58

Linux桌面

2017-08-30 17:59:20

Linux程序設計優化措施

2009-09-09 14:26:37

2010-08-27 14:48:22

DB2like

2010-01-15 10:34:59

Linux命令行操作
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美在线a | www.狠狠干| 中文字幕国产在线 | 国产在线一区二区 | 国产www在线 | 99热都是精品 | 国产精品久久久久久久免费大片 | 国产精品九九 | a亚洲精品| 一级欧美黄色片 | 欧日韩在线 | 在线视频国产一区 | 国产精品毛片 | 久久久久久国产精品久久 | 欧美激情综合色综合啪啪五月 | 国产一区二区三区在线视频 | 玖玖国产精品视频 | 国产精品网址 | 成人性视频免费网站 | 日本 欧美 三级 高清 视频 | 国产精品揄拍一区二区 | 久久美女网 | 国产精品一区二区三区在线 | 欧美www在线| 99热播精品 | 亚洲免费网站 | 麻豆久久久久久久 | 久久久91 | 国产一区二| 中文字幕亚洲精品 | 99精品欧美一区二区蜜桃免费 | 久久久久久久久淑女av国产精品 | 紧缚调教一区二区三区视频 | 国产精品久久久久久久久久久久久久 | 欧美一级片在线观看 | 麻豆精品一区二区三区在线观看 | 国产成人福利视频 | 国产中文字幕av | 中文字幕一区在线观看视频 | 99精品欧美一区二区三区 | 欧美成年网站 |