專案開發中,在安裝linux系統的arm9板上,需要實時檢測usb口與windows客戶端的連線和斷開情況,從而中斷命令的傳送,由於usb的連線和資料互動使用的串列埠通訊,在板子啟動的指令碼就直接載入了g_serial.ko的模組,在dev目錄下生成了ttygs0的埠號。串列埠通訊中斷埠位址也不會消失,因此,只有通過在一定時間內檢測埠的讀寫狀態來判斷串列埠通訊是夠正常,如超時則認為連線斷開。
首先,開啟串列埠
//以讀寫方式開啟usb,嘗試5次
int fd = -1;
for(int i=0;i<5;i++)
由於使用g_serial.ko載入串列埠模組,不需要額外設定串列埠引數。
清空埠快取
tcflush(fd, tcioflush); //clear port caches
建立執行緒收發埠資料
//建立usb收發執行緒
pthread_t tid;
pthread_create(&tid, null, thread_usb_sendrecv, this);
執行緒函式如下
void* thread_usb_sendrecv(void *pdata)
}qprint("thread_usb_sendrecv dead!!!!");
return 0;
}
由於串列埠通訊使用的阻塞io的模式,當返回的nret<0時,認為usb通訊錯誤或斷開了連線,因此需重啟usb,重啟操作即重新開啟/dev/ttygs0埠,如果能正常通訊則繼續收發資料,這裡不作為usb斷開或拔出的判斷。
usb拔出的判斷只能在另乙個監控執行緒處理超時,即規定時間內沒有讀取到資料則認為通訊斷開或usb線拔出。這裡使用乙個計數器來設定,在read到資料後重置計數器。
ssize_t readforusbhost(int fd, void* buf, size_t nbytes)
監控執行緒即重新開闢乙個執行緒每隔1秒鐘比對一下計數器
int usbserial::checkusbportconstatus()
return 1;
}
11 3 USB轉串列埠通訊
隨著技術的發展,工業上還有 rs232 串列埠通訊的大量使用,但是商業技術的應用上,已經慢慢的使用 usb 轉 uart 技術取代了 rs232 串列埠,絕大多數膝上型電腦已經沒有串列埠這個東西了,那我們要實現微控制器和電腦之間的通訊該怎麼辦呢?我們只需要在電路上新增乙個 usb 轉串列埠晶元,就可...
C 中USB轉串列埠的拔插捕獲
from c 中usb轉串列埠的拔插捕獲 最近乙個c 專案使用者要求能夠實現插入usb介面,自動識別所接入的串列埠,而無需人工去選擇插入的是那個串列埠。通過一陣子的資料蒐羅,總算找到乙個最佳的實現方案。以前是通過執行緒迴圈逐個開啟串列埠,傳送握手包來確認接入的是那個串列埠,這麼做能實現,不過會產生通...
Linux 串列埠通訊
011 08 03 13 04 389人閱讀收藏 舉報以前跟著做過vxworks的開發,主要通訊方式是串列埠,因為底層bsp包已經做好了,串列埠通訊非常簡單。後來接觸linux,在一塊ok6410上跑linux串列埠通訊,才發現原來天真的以為甚是簡單的串列埠變得如此的不簡單。include 1 串列...