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