![当从串行设备仅接收 CR 时,如何使屏幕向下一行并从头开始?](https://linux22.com/image/158832/%E5%BD%93%E4%BB%8E%E4%B8%B2%E8%A1%8C%E8%AE%BE%E5%A4%87%E4%BB%85%E6%8E%A5%E6%94%B6%20CR%20%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E4%BD%BF%E5%B1%8F%E5%B9%95%E5%90%91%E4%B8%8B%E4%B8%80%E8%A1%8C%E5%B9%B6%E4%BB%8E%E5%A4%B4%E5%BC%80%E5%A7%8B%EF%BC%9F.png)
我正在使用 screen: 连接到串行端口screen /dev/cu.usbserial-A703XAOG
。另一端的设备仅向单独的行发送回车符。 Screen 仅在收到回车时从行首开始,不会向下一行,从而用下一行输出覆盖最后一行输出。
我可以更改icrnl
串行端口的设置,它会将回车符转换为换行符。尽管现在屏幕在写入下一行输出之前会向下移动一行,但当仅接收换行符时,它不会从头开始。
Ctrl-A我使用, Ctrl+转储了 .termcap 文件.。我阅读了 termcap,了解到:
如果终端有一个移动到下一行第一列的命令,则该命令可以指定为 nw(换行符)。
这是我当前的~/.screenrc
文件:
termcap SC nw=^M
其中SC
与转储的 .termcap 文件中的名称匹配。
这并没有达到我所希望的效果。也许termcap
命令不是正确的方法?
当从串行设备仅接收 CR 时,如何使屏幕向下一行并从头开始?
编辑:
sudo stty -f /dev/cu.usbserial-A703XAOG -a
这是屏幕连接到串行端口时的输出:
speed 9600 baud; 0 rows; 0 columns;
lflags: -icanon -isig iexten -echo echoe echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
-extproc
iflags: -istrip -icrnl -inlcr -igncr -ixon -ixoff -ixany -imaxbel -iutf8
-ignbrk brkint -inpck ignpar -parmrk
oflags: -opost -onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd -hupcl clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ^@; eol2 = ^@;
erase = ^?; intr = ^C; kill = ^H; lnext = ^V; min = 100;
quit = ^\; reprint = ^R; start = ^Q; status = ^T; stop = ^S;
susp = ^Z; time = 2; werase = ^W;
编辑:
我知道有些软件可以解决这个问题,例如油灰我需要启用“每个 CR 中的隐式 LF”设置,并在串行我需要启用“将独立 CR 解释为 CRLF”。但我的问题具体是关于 的screen
,因为这是我当前用来连接串行端口的软件。
编辑:
Screen 模拟 VT100 终端,它应该识别控制序列(来源)。我需要设置“自动换行模式”(也称为新线模式)。这应该使用参数值 20: 的设置模式控制序列来完成ESC [ 20 h
。
如何将此控制序列传递到屏幕?
答案1
对我来说似乎有用的东西是通过向其发送您找到的换行模式转义序列来操纵屏幕具有的伪tty,并为其提供一个 stty 命令以将回车符转换为换行符。用于ps a
查找 pty:
16947 pts/4 Ss+ 0:00 screen -S myscreen /dev/ttyS0
然后给出命令
pty=/dev/pts/4
stty -F $pty ocrnl
echo -en '\e[20h' >$pty