1. 程式人生 > >ser2net過濾特殊字元

ser2net過濾特殊字元

許多流行的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就不再會過濾掉特殊字元了。