許多流行的linux串口編程的版本中都沒對c_iflag(termios成員變量)這個變量進行有效的設置,這樣傳送ASCII碼時沒什麼問題,但傳送二進制數據時遇到0x0d,0x11和0x13卻會被丟掉。不用說也知道,這幾個肯定是特殊字符,被用作特殊控制了。關掉ICRNL和IXON選項即可解決。
c_iflag &= ~(ICRNL | IXON);
- 0x0d 回車符CR
- 0x11 ^Q VSTART字符
- 0x13 ^S VSTOP字符
- ICRNL 將輸入的CR轉換爲NL
- IXON 使起動/停止輸出控制流起作用
在《UNIX環境高級編程第二版》第18章第11小節看到把終端I/O設置爲原始模式(串口通訊就是終端I/O的原始模式)時輸入屬性設置爲
term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
這三個數據是串口通信裏面特殊字符,具有特別的意義,會被ser2net過濾掉,那麼怎麼保證數據完整無誤地傳輸呢?
方法一:
修改ser2net源代碼,選擇在OpenWRT源碼編譯鏡像的時候就將此軟件包配置好,簡單的方法就是修改編譯所需軟件包中的配置文件,文件路徑:/dl/ser2net-2.9.1.tar.gz(請根據編譯系統所需版本號選擇修改)
tar -zxvf ser2net-2.9.1.tar.gz
進入我們解壓的目錄
cd ser2net-2.9.1/
ls
可以找到ser2net.config,對其進行編輯
vi ser2net.conf
將XONXOFF刪除,將ttyS0改爲ttyATH0,另外此處還可以修改端口號及串口波特率。wq保存退出,然後退回到dl目錄,刪除之前的軟件包,重新壓縮。
修改後:
cd ..
rm ser2net-2.9.1.tar.gz
tar –zcvf ser2net-2.9.1.tar.gz ser2net-2.9.1/
方法二
用winscp登陸WIFI板,轉到/etc/目錄,打開ser2net.conf文件,找到如下配置:
2001:raw:600:/dev/ttyATH0:9600 NONE 1STOPBIT 8DATABITS XONXOFF LOCAL -RTSCTS
將其中藍色字體部分刪除,變爲:
2001:raw:600:/dev/ttyATH0:9600 NONE 1STOPBIT 8DATABITS LOCAL -RTSCTS
保存,再重啓WIFI板,ser2net就不再會過濾掉特殊字符了。