我正在连接到 /dev/ttyACM0 上的 USB 串行连接。发送方的代码\f
定期发送一个字符。
print("----------------------------\n\r");
print("-- LED CONTROLLER 00.01 --\n\r");
print("----------------------------\n\r");
print("\n\f");
但是,当我cat /dev/ttyACM0
从控制台运行时,输出会向下滚动屏幕,而不是在顶部刷新。
我已经深入研究了当前stty
设置(通过输入stty -F /dev/ttyACM0 -a
),它给出了以下输出:
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^A; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke
读取stty --help
页面会出现换页延迟 ( ff0
),但不指示如何更改其他任何内容。我还发现这一页这表明我可以像这样设置 FormFeed 字符FormFeed=014
,但该语法不适用于我的 stty 版本(stty --version
给出stty (GNU coreutils) 8.5
)。
Windows 中的 Putty 表现出正确的行为,但我很难让它在 Debian 6 中工作。有谁知道如何配置 stty 将换页解释为终端清除?
答案1
GNU sed 对于解决这个问题并不是必需的(尽管脚本更容易阅读)。一个最小的脚本是(在 Solaris 和 OSX 上测试):
sed -e 's/^L/^[[H^[[J/g'
其中^L
和是换页和转义^[
的文字控制字符。您可以使用(要插入转义字符,首先键入)将它们插入文件中。controlLcontrol[vi
controlV
转义序列用于
- 将光标移动到起始位置
^[[H
并 - 清除显示
^[[J
一些注意事项:
- 没有必要在转义中给出行和列
^[[H
(并且在任何情况下,位置以1, 不是0), 和 - 如果屏幕被清除前移动光标,
2
在转义中需要 a,例如 ,^[[2J
因为这会清除整个显示。默认^[[J
清除从当前位置到显示末尾的内容。例如,一些非标准终端ansi.sys
没有做出这种区分。
有些人对 bash 使用^L
键盘快捷键来清除屏幕以及 PuTTY 的解释感到困惑^L
(请参阅为什么当我输入 control/L 时屏幕没有清除?在 XTerm 常见问题解答中)。
进一步阅读:
答案2
您需要将换页符 ( \f
) 替换为正确的ANSI 转义码。
你可以这样做GNU sed:
sed 's/\f/\o33[2J\o33[0;0H/g' /dev/ttyACM0
详细信息:\033[2J
清除屏幕,\033[0;0H
:转到 pos 0,0
(如果这不起作用,请尝试 tail -f /dev/ttyACM0 | sed 's/\f/\o33[2J\o33[0;0H/g'
)
编辑:作为@MarkReel 评论道,您可以用于非 GNU sed 版本(例如 BSD sed)ANSI 转义字符串:
sed $'s/\f/\e[2J\e[0;0H/g' /dev/ttyACM0
答案3
当您的 FPGA 执行时,print("\n\f")
它实际上在其标准输出上发送两个字节,第一个字节是换行符,第二个字节是换页符。这些字节是 0x0A 和 0x0C。
然后,标准输出通过 USB 电缆传输,并通过模拟串行设备读取。该串行设备只会将两个字节传输到控制终端(因为您正在通过命令读取它cat
),并最终传输到您的 gnome 终端、xterm 或您正在使用的任何其他程序。该终端仿真器必须理解这两个字节并采取相应的行动。
因此,您必须检查模拟器的功能。您使用的是哪一款?
答案4
由于问题在于 ANSI 终端的正确模拟,我认为最好的选择是使用minicom
.只需记住在不初始化调制解调器的情况下打开串行设备,即在启动时不发送 hayes 命令。