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 默认配置问题,结果还真找到了。解决方法:

扫描二维码关注公众号,回复: 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目录下。






猜你喜欢

转载自blog.csdn.net/jin615567975/article/details/71629772