串列埠VMIN VTIME 詳解

2021-07-11 04:20:04 字數 2720 閱讀 5956

以前跟著做過vxworks的開發,主要通訊方式是串列埠,因為底層bsp包已經做好了,串列埠通訊非常簡單。後來接觸linux,在一塊ok6410上跑linux串列埠通訊,才發現原來天真的以為甚是簡單的串列埠變得如此的不簡單。#include 1、串列埠的操作1.1開啟:fd = open("/dev/ttysac1", o_rdwr | o_noctty | o_ndelay); o_rdwr 讀寫方式開啟; o_noctty 不允許程序管理串列埠(不太理解,一般都選上); o_ndelay 非阻塞(預設為阻塞,開啟後也可以使用fcntl()重新設定)1.2寫入:n = write(fd, "linux", 5); n實際寫入位元組數;1.3讀取:res = read(fd,buf,len); res 讀取的位元組數;1.4設定:fcntl(fd, f_setfl, fndelay); //非阻塞 fcntl(fd, f_setfl, 0); // 阻塞1.5關閉:close(fd);2、串列埠配置struct termios options; // 串列埠配置結構體tcgetattr(fd,&options); //獲取當前設定bzero(&options,sizeof(options));options.c_cflag |= b115200 | clocal | cread; // 設定波特率,本地連線,接收使能options.c_cflag &= ~csize; //遮蔽資料位options.c_cflag |= cs8; // 資料位為 8 ,cs7 for 7 options.c_cflag &= ~cstopb; // 一位停止位, 兩位停止為 |= cstopboptions.c_cflag &= ~parenb; // 無校驗 |= parenb; //有校驗 &= ~parodd // 偶校驗 |= parodd // 奇校驗options.c_cc[vtime] = 0; // 等待時間,單位百毫秒 (讀)。後有詳細說明options.c_cc[vmin] = 0; // 最小位元組數 (讀)。後有詳細說明tcflush(fd, tcioflush); // tciflush刷清輸入佇列。 tcoflush刷清輸出佇列。 tcioflush刷清輸入、輸出佇列。tcsetattr(fd, tcsanow, &options); // tcsanow立即生效; tcsadrain:wait until everything has been transmitted; tcsaflush:flush input and output buffers and make the change3、vtime 和 vminvtime 定義要求等待的零到幾百毫秒的值(通常是乙個8位的unsigned char變數)。vmin 定義了要求等待的最小位元組數, 這個位元組數可能是0。只有設定為阻塞時這兩個引數才有效,僅針對於讀操作。說起來比較複雜,舉個例子吧,設定為阻塞狀態,寫操作未進行實驗,這裡僅討論讀操作,read(fd,&buf,8); // 讀串列埠3.1 options.c_cc[vtime] = 0;options.c_cc[vmin] = 0;vmin = 0,當緩衝區位元組數 >= 0 時進行讀操作,實際上這時讀串列埠操作並未被阻塞,因為條件始終被滿足。3.2options.c_cc[vtime] = 0;options.c_cc[vmin] = 1;vmin = 1,當緩衝區位元組數 >= 1 時進行讀操作,當沒有資料時讀串列埠操作被阻塞。3.3options.c_cc[vtime] = 0;options.c_cc[vmin] = 4;vmin = 4,當緩衝區位元組數 >= 4 時進行讀操作,否則讀串列埠操作被阻塞。每次讀出的最大位元組數由read函式中第三個引數決定。直到緩衝區剩下的資料< read 第三個引數 並且< 4 (如果這時read第三引數為 1 則進行4次讀操作直至讀完緩衝區,如read第三引數為2,連續進行讀操作,直至緩衝區空或還剩乙個字元)。沒有設定vtime,剩下的字元沒有確定的期限,直到下次滿足讀條件的時候才被讀出。----------------------------------考慮vtime-----------------------------3.4options.c_cc[vtime] = 10; //單位百毫秒options.c_cc[vmin] = 4;同3.3的區別就是,沒滿足條件或讀緩衝區中剩下的資料會在1秒(10百毫秒)後讀出。另外特別注意的是當設定vtime後,如果read第三個引數小於vmin ,將會將vmin 修改為read的第三個引數,即使用read(fd,&buf,2);,以上設定變為:options.c_cc[vtime] = 10;options.c_cc[vmin] = 2;

vtime定義等待的時間,單位是百毫秒(通常是乙個8位的unsigned char變數,取值不能大於cc_t)。

vmin定義了要求等待的最小位元組數,這個位元組數可能是0。

如果vtime取0,vmin定義了要求等待讀取的最小位元組數。函式read()只有在讀取了vmin個位元組的資料或者收到乙個訊號的時候才返回。

如果vmin取0,vtime定義了即使沒有資料可以讀取,read()函式返回前也要等待幾百毫秒的時間量。這時,read()函式不需要像其通常情況那樣要遇到乙個檔案結束標誌才返回0。

如果vtime和vmin都不取0,vtime定義的是當接收到第乙個位元組的資料後開始計算等待的時間量。如果當呼叫read函式時可以得到資料,計時器 馬上開始計時。如果當呼叫read函式時還沒有任何資料可讀,則等接收到第乙個位元組的資料後,計時器開始計時。函式read可能會在讀取到vmin個位元組 的資料後返回,也可能在計時完畢後返回,這主要取決於哪個條件首先實現。不過函式至少會讀取到乙個位元組的資料,因為計時器是在讀取到第乙個資料時開始計時 的。

如果vtime和vmin都取0,即使讀取不到任何資料,函式read也會立即返回。同時,返回值0表示read函式不需要等待檔案結束標誌就返回了。

串列埠DCB結構詳解

串列埠dcb結構詳解 成員說明 dcblength dcb結構大小,即sizeof dcb 在呼叫setconmstate來更新dcb前必須作設定 baudrate 指定當前採用的波特率,應與所連線的通訊裝置相匹配 fbinary 指定是否允許二進位制模式。win32 api不支援非二進位制模式傳輸...

Java串列埠通訊詳解

序言 說到開源,恐怕很少有人不挑大指稱讚。學生通過開源 學到了知識,程式設計師通過開源類庫獲得了別人的成功經驗及能夠按時完成手頭的工程,商家通過開源軟體賺到了錢 總之是皆大歡喜。然而開源軟體或類庫的首要缺點就是大多缺乏詳細的說明文件和使用的例子,或者就是軟體 隨便你用,就是文件,例子和後期服務收錢。...

Linux C 串列埠程式設計 詳解 例項

linux下的串列埠程式設計其實與windows下無本質差別,說白了就是類似讀寫檔案一樣,對串列埠進行讀寫操作,用到的函式無非就是open,close,read,write函式等。具體的讀寫操作可分為下面四個步驟 開啟串列埠 配置串列埠 讀寫串列埠 關閉串列埠 串列埠配置主要包括波特率的配置,校驗位...