1. open /dev/ttyusb0 failed 問題定位
基於虛擬機器,在ubuntu上進行adaptive_hand控制除錯時,發現:程式關閉,再重新執行時,有時會出現open /dev/ttyusb0 failed;必須將串列埠裝置重新插拔,才可以再次成功開啟串列埠。
- 通訊類的析構函式中,未使用close()顯示關閉串列埠,加上之後,開啟失敗現象少很多,但偶爾也會出現,此時多嘗試開啟幾次,或重新插拔串列埠;
2.串列埠丟包問題
參考:串列埠丟包受什麼影響_總結一下曾經在串列埠方面犯的錯誤
串列埠通訊丟包原因分析:
- 因為串列埠資料並不是一定能讀到對方發的完整資料,這個和驅動效能、波特率、線長、電磁干擾等很多東西都有關
通訊速率設的太高了,高的話容易丟資料
- cpu本身效能限制 或者 匯流排的限制 導致中斷響應不過來。
高速 大資料通訊時會出現。cpu本身限制 中斷響應不過來,這時候一般可以選擇更低的波特率、或者更小的封包,或者發包時加一些延時來解決,不過 這些都是應用層的解決方案,在驅動層能做的工作,微乎其微。
由於應用程式效率不高,導致cpu loading 過大,持續100%,可能會有中斷丟失的現象,也會導致丟包。這時候優化程式顯的格外重要,減少不必要的printf,printf 是非常耗時的。
除錯、問題定位:
- 實際抓取一下,看一下丟包的現象是不是重複,必須排除通訊線路的問題;
- 用串列埠除錯助手測試一下硬體和驅動的效能。
- 串列埠buf改大點,速度放慢點試試看
問題解決
- 串列埠丟包是不可避免的,因此應該從通訊協議和互動方式上著手改進,使得在偶爾資料丟包的情況下,能盡可能使雙方傳送的資料仍能被對方接收;
- 通訊協議不要採用一收一發的形式,最好開兩個執行緒,乙個用來接收解析資料,另外乙個用來定時迴圈傳送資料;
3.串列埠通訊,資料接收、解析時出現「stack smashing detected」錯誤,即段錯誤,導致上位機程式崩潰
- 上位機資料接收時,在check sum 錯誤的情況下,未對變數m_rcv_len清零,使得m_rcv_len越來越大,超過rcv_buffer[buffer_size] 的size,就會出現段錯誤;
tips::段錯誤往往難以通過gdb除錯準確定位具體位置,一定要對各種情況的邏輯進行充分的梳理,根據異常列印資訊逐步排查;
4. uart解析例項
參考:串列埠通訊協議制定**
uart是全雙工通訊,可開兩個執行緒,乙個用來接收解析資料,另外乙個用來定時迴圈傳送資料;
read()和write()函式操作的是讀快取區和寫快取區,不需要進行mutex.lock();
fd_isset(m_fd, &rd)檢查串列埠描述符是否準備好,以便進行接下來的處理操作;如果未準備好,會直接返回-1;
因此,串列埠通訊,最好有個迴圈一直呼叫recv_mcu_data()接收函式,直到接收成功.
經測試,呼叫一次recv_mcu_data()很多時候是接收失敗的,因為串列埠資源未準備好(被mcu send占用);一般要2-6次呼叫recv_mcu_data(),才會接收成功一次。
迴圈可以寫在recv_mcu_data()內,變成阻塞直到接收成功為止;也可在外部反覆呼叫recv_mcu_data(),直到接收成功(一定次數內)。
5. 和多執行緒互斥鎖mutex同用時,造成的死鎖問題
一般情況下兩個執行緒對同乙個mutex進行lock,並不會造成死鎖,後lock的執行緒會進入等待狀態,直到前乙個進行unlock。
但如果,在lock**塊中有串列埠通訊(檔案讀寫)recv_mcu_data()時,兩個執行緒也會導致程式卡死,無法傳送和接收資料(在欠驅手串列埠通訊讀、寫執行緒中測試到,如果將串列埠通訊recv_mcu_data()函式放在lock**塊之外,則不會造成死鎖)。 因為串列埠通訊、檔案讀寫等輸入輸出操作,本身就是執行緒互斥的。
6.開啟串列埠後,清除快取
fd = open("devpath", o_rdwr|o_noctty);
usleep(200000);
tcflush(fd, tciflush); //清空輸入快取
tcflush(fd, tcoflush); //清空輸出快取
7.linux 串列埠程式設計詳解 微控制器串列埠通訊小結
網上有很多講串列埠通訊的知識點,看了很多,今天就總結一下吧,歡迎拍磚!1.資料傳輸 微控制器的序列通訊使用的是非同步序列通訊,所謂非同步就是指傳送端和接收端使用的不是同一時鐘。非同步序列通訊通常以字元 或者位元組 為單位 組成字元幀傳送。字元幀由傳送端一幀一幀的傳送,接收端通過傳輸線一幀一幀地接收。...
串列埠通訊 串列埠通訊原理
1 rs232介面 rs232 c介面聯結器一般使用型號為db 9的9芯插頭座,只需3條介面線,即 傳送資料 接收資料 和 訊號地 即可傳輸資料,其9個引腳的定義如圖11 3所示。圖11 3 rs232 c介面聯結器定義 在rs232的規範中,電壓值在 3v 15v 一般使用 6v 稱為 0 或 o...
計算機串列埠通訊相關概念
一條資料線,將資料按位傳輸。長距離傳送成本低,操作較複雜。兩字元間的間隙是任意的,但同一字元的相鄰兩位間的間隔是固定的,以便接收方區分不同位。關於開始位和停止位 本人理解,且傳輸規則不同時會有偏差 非同步序列通訊中,匯流排在空閒時是高電平,規定起始位是低電平,接收方收到電平下降沿時同步自己的時鐘並準...