UART遇到兩個與 stty 相關問題
阿新 • • 發佈:2019-01-22
1.
device 傳送單個字元,PC 接收正常;PC 傳送單個字元給device,需要傳送四次,device才能一起接收過來。
/ # echo "a" > /dev/ttyHSL1 ---正常
/ # cat /dev/ttyHSL1 --- 字元大於4個位元組或者單個字元傳送四次,device這邊才能接收到
aaaa
問題就在於 stty 的預設配置:裡面有 min=4,我們可以試一下把 min 改成 1,/ # stty -F /dev/ttyHSL1 speed 115200 baud; line = 0; intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 4; time = 0; -brkint ixoff -imaxbel -isig -icanon -iexten -echo
/ # stty -F /dev/ttyHSL1 min 1
問題解決。通過man stty 知道 :
Special settings:
min N with -icanon, set N characters minimum for a completed read
即 min N 的含義為: 和 -icanon 配合使用,設定每次一完整讀入的最小字元數為<N>2.
用UART 傳送資料時,會多出一行回車,根據上面的經驗,應該還是stty 預設配置問題,結果還真找到了。解決方法:
onlcr 什麼含義呢?/ # stty -F /dev/ttyHSL1 -onlcr
Output settings:
* [-]onlcr translate newline to carriage return-newline
即 enable onlcr 意味著 將換行符轉換為回車加換行,這裡面應該就是windows 和Linux文字換行符的問題。Windows下用的是\r\n, 即CR&LF,ASCII是 0A0D.
linux/unix用的是\n, 即LF OA,ASCII 是0A.
所以傳送字串 echo "a" > /dev/ttyHSL1 ,在PC 端用SSCOM軟體接收,enable onlcr 時 HEX 顯示是:61 0D 0A, 而disable onlcr 時 HEX顯示是:61 0A
綜上,看來很多UART 問題都與stty 的預設配置有關。stty的原始碼 stty.c 在busybox的coreutils目錄下。