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 默认配置问题,结果还真找到了。解决方法:
扫描二维码关注公众号,回复:
2410783 查看本文章
/ # 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目录下。