linux串列埠知識深入 收到資料異常問題處理

2022-06-17 15:18:13 字數 2086 閱讀 6331

對於串列埠並不陌生,使用了n遍,總以為理解很深刻,實際上還有很多細節未知。

近期在處理新的板子發現串列埠收發很不正常,經常少一些資料、莫名其妙資料被串改了,導致校驗通不過,現象很詭異

例如存在以下幾種現象,可能就是這個問題:

這樣當然不行

主要原因串列埠在預設情況下,會進行自動字元轉換或一些特殊處理:

這些處理,感覺很智慧型(可能在一些特殊場合下,比較方便),實際上會給我們帶來一些麻煩(我們大部分是傳輸二進位制資料),如果不知道原因的話,往往需要花費很大精力去找原因

主要涉及到幾個引數:

tcflag_t c_iflag; /* 輸入模式 */

tcflag_t c_oflag; /* 輸出模式 */

tcflag_t c_cflag; /* 控制模式 */

tcflag_t c_lflag; /* 本地模式 */

cc_t c_cc[nccs]; /* 控制字元 */

知道原因,就好改,網上也有很例項:

opt.c_iflag &= ~(icrnl | inlcr);

opt.c_iflag &= ~(ixon |ixoff | ixany);

opt.c_oflag &= ~(onlcr |ocrnl);

opt.c_oflag = 0; ///< 輸出模式

opt.c_lflag = 0; ///< 本地模式

opt.c_iflag = ignbrk; ///< 輸入模式

opt.c_iflag &= ~(ixon|ixoff|ixany);

opt.c_cc[vmin] = 1; ///< 最少1位元組

opt.c_cc[vtime] = 1; ///< wait time

其實還有很多引數,有興趣的可以詳細了解下。

題外話:

今天,又測試不行了。但原因還不太一樣,先把**貼出來對比下。

原先**:

tcgetattr(m_hserial,&opt);

opt.c_cflag &= ~csize;

opt.c_cflag |= (b115200 | cs8 | clocal | cread);

//無奇偶校驗

opt.c_cflag &= ~(parenb | parodd);

//1位 停止位

opt.c_cflag &= ~crtscts;

opt.c_cflag &= ~cstopb;

//設定引數

opt.c_oflag = 0; ///< 輸出模式

opt.c_lflag = 0; ///< 本地模式

opt.c_iflag = ignbrk; ///< 輸入模式

opt.c_iflag &= ~(ixon|ixoff|ixany);

改進之後,可行的**:

tcgetattr(m_hserial,&opt);

int nbaud = b115200;

cfsetospeed(&opt,(speed_t)nbaud);

cfsetispeed(&opt,(speed_t)nbaud);

opt.c_cflag &= ~csize;

opt.c_cflag |= (cs8 | clocal | cread);

//無奇偶校驗

opt.c_cflag &= ~(parenb | parodd);

//1位 停止位

opt.c_cflag &= ~crtscts;

opt.c_cflag &= ~cstopb;

//設定引數

opt.c_oflag = 0; ///< 輸出模式

opt.c_lflag = 0; ///< 本地模式

opt.c_iflag = ignbrk; ///< 輸入模式

opt.c_iflag &= ~(ixon|ixoff|ixany);

對比下**,沒太多區別。就是對波特率設定有點不一樣

現在:先獲取,然後 直接設定波特率,還設定i或o兩個方向波特率,也就是說收發可以不一樣的波特率?

另外補充下,虛擬機器下的虛擬串列埠 波特率是無效的,不管設什麼樣,都一樣的。

QT接收到串列埠收到的十六進製制資料判斷問題

這個專案是移植到開發板上的程式,以前在windows下通過串列埠收到的qbytearray資料通過temp i 0xeb這種寫法沒有出過錯誤。由於在開發板上執行,串列埠沒有通過qt自帶的serialport類接收資料,並且無法打斷點,所以只能對比列印來判斷。通過列印出的資料可以看到,程式在判斷0xa...

Linux列印串列埠資料

有兩種方法可以列印串列埠資料,一種方法是使用cat配合stty,另一種方法是使用socat。mingdu.zhengatgmaildotcom stty f dev ttys0 ispeed 115200 ospeed 115200 cs8 cat dev ttys0cat可以直接把串列埠資料列印到...

Linux讀取串列埠資料

大致為 有乙個傳送端週期性的往本機串列埠上傳送資料,本機需要定時讀取串列埠資料,解析,獲取自己想要的資訊。實際描述為 由於是做智慧型駕駛的,需要讀取車輛速度,通過obd裝置讀取並解析車輛速度,然後通過藍芽傳送給pc串列埠 也是通過乙個藍芽模組接收 pc端串列埠定時接收串列埠資料並解析。在上述過程中,...