1. 程式人生 > >解決Linux下串列埠資料接收不全的異常問題

解決Linux下串列埠資料接收不全的異常問題

1、引言

    最近在Linux下除錯串列埠程式,遇到了串列埠資料接收不全的異常問題,經過將近一上午的努力終於找到問題根源,特此分享給大家,此次除錯過程中用到了主要用到了minicom工具,至於minicom的使用大家可以自行查詢相關資料。

2、正文

    此次除錯環境實在兩個平臺下,負責傳送串列埠資料一方是VxWorks平臺,負責接收的一方是arm+Linux平臺,傳送的是一些必要的時間和其他資訊,以下簡稱VxWorks和Linux 在Linux下接收串列埠資料偶爾出現接收不全的情況,具體分析過程如下:

1、通過在VxWorks傳送和Linux接收的地方分別新增列印,並且中控傳送有問題的固定資料,從一個異常問題變為必現的問 題。

2、VxWorks平臺繼續傳送有問題資料,並且通過Linux工具的minicom工具(使用方法自行查閱)進行接收串列埠資料,檢視資料是 否異常,經過分析發現通過minicom接收的資料同樣也有問題,排除程式的邏輯問題,懷疑可能是串列埠設定屬性問題。

3、研究丟失的位元組資料找到相關規律,發現每次丟失資料都是ox13 19  因為VxWorks給Linux同步的時間中日期正好是6月19號,此問題也在這一天必現,並且繼續測試發現0x11資料同樣也存在這種問題,目前基本確定是這幾個資料的問題。

3、問題解決

struct termios options;
tcgetattr( g_iSonarComFd,&options);
// 遮蔽 0x0d   0x11  0x13 這些特殊字元 解決這些特殊字元收不到的問題
options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
tcsetattr(g_iSonarComFd,TCSANOW,&options)

4、總結

此次問題解決主要依賴於工具和運氣,因為正好趕在當天的日期中含有特殊字元,總結此問題和大家分享