如何配置我的 tty 会话,以便换页符“\f”将清除终端?

如何配置我的 tty 会话,以便换页符“\f”将清除终端?

我正在连接到 /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[vicontrolV

转义序列用于

  • 将光标移动到起始位置^[[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 命令。

相关内容