1. 程式人生 > >UART遇到兩個與 stty 相關問題

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