天天看點

UART遇到兩個與 stty 相關問題

1.

device 發送單個字元,PC 接收正常;PC 發送單個字元給device,需要發送四次,device才能一起接收過來。

/ # echo "a" > /dev/ttyHSL1            ---正常

/ # cat /dev/ttyHSL1                   --- 字元大于4個位元組或者單個字元發送四次,device這邊才能接收到
aaaa
           

問題就在于 stty 的預設配置:

/ # 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
           

裡面有 min=4,我們可以試一下把 min 改成 1,

/ # 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 預設配置問題,結果還真找到了。解決方法:

/ # stty -F /dev/ttyHSL1 -onlcr
           

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目錄下。

繼續閱讀