對於串列埠並不陌生,使用了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端串列埠定時接收串列埠資料並解析。在上述過程中,...