如何在 gnu 屏幕中切换 CR/LF?

Posted

技术标签:

【中文标题】如何在 gnu 屏幕中切换 CR/LF?【英文标题】:How to toggle CR/LF in gnu screen? 【发布时间】:2011-12-10 08:38:52 【问题描述】:

我正在使用屏幕从串行控制台读取文本。问题是输出好像只有换行符\n,没有回车符\r,所以显示是这样的……

Line1
     Line2
          Line3

不知道有没有补丁可以解决这个问题?

【问题讨论】:

可能有一些stty 设置?虽然我觉得你在阅读时看到这一点很奇怪。 @ninjalj,他是几年前的事了。但是,在阅读时观察这一点是有意义的。在这种情况下,设备不发送回车符,因此stty 指示终端将换行符视为换行符回车符。否则,我们可以看到终端移动到下一行,但不会将索引指针返回到行首,就像 \r\n 一起发送时一样。 【参考方案1】:

<b>onlcr</b> 用于将 outgoing newlines 翻译成 carriage returns.

stty -F /dev/ttyS0 inlcr 会将 incoming 换行转换为回车。您可以在启动屏幕后从另一个终端运行它,以避免在启动时重置该屏幕。然而不幸的是,这只会改变问题。然后,您将只得到回报,没有换行符。

需要一个选项来追加返回到传入的换行符,以便终端接收\n\r,这是串行设备应该输出的内容第一名。似乎有一个 onlret 选项可以为传出数据执行此操作,但没有 inlret 选项,因为在这种情况下我们似乎需要。

我遇到了完全相同的问题(尽管使用 picocom),并且我一直在谷歌上搜索几天试图找到标准修复程序,但似乎没有人有这个问题。有许多串行设备只输出\n,根本不能输出\r\n,我拒绝相信它们都只属于两个linux用户。什么给了!?

【讨论】:

在 picocom 中,您可以将 --imap lfcrlf 添加到命令行选项中。这将在从串行端口读取 LF 后将其转换为 CR + LF。 另外,对于那些使用 Gtkterm 的用户,请检查“配置”菜单下的“CR LF auto”。 microcom 会自动处理映射 " 您可以在启动屏幕后从另一个终端运行它,以避免在启动时重置屏幕。" --- 这似乎并非在所有情况下都是正确的。在我的设备上,如果我在启动屏幕后尝试运行stty,我会得到Device or resource busy【参考方案2】:

如果您使用 pyserial 附带的 miniterm.py 程序,它会将换行符解释为 crlf。它不是功能最全的终端仿真器,但可以与简单的串行设备交互,它可以完成工作。

使用语法(在 OSX 上):

miniterm.py /dev/tty.usbserial-XXXXXX 115200

将 XXXXXX 替换为系统上出现的任何设备。

【讨论】:

感谢分享,屏幕真的让我很紧张!【参考方案3】:

试试stty onlcr

man page 表示它将在输出时将换行符转换为回车符/换行符对,这似乎是您所需要的。

【讨论】:

是的,我试过了,但是没有用。 stty -F /dev/ttyS0 onlcr 奇怪的是,我用screen打开串口后,stty设置又变回了-onlcr。我想知道 screen 是否会覆盖 stty 中设置的设置?我用来运行screen的命令:screen /dev/ttyS0 115200 有趣,看起来screen 在启动时重置了它正在运行的 TTY。我不知道您是否可以在不修补和构建自己的二进制文件的情况下解决这个问题。 在屏幕源代码中,tty.c 中有定义(ONLCR)。我试试看 有谁知道如何配置tty.sh?【参考方案4】:

在我的情况下工作:stty -F /dev/ttyACM0 -icrnl

因为序列被隐式设置为将 CR 转换为 NL。此命令将其设置回来。注意icrnl 前面的减号。

【讨论】:

这似乎对我不起作用。 Screen 会在启动时重置 stty 配置的任何选项,因此它什么也不做。向屏幕提供-icrnl 似乎被忽略了?

以上是关于如何在 gnu 屏幕中切换 CR/LF?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建SSIS脚本任务以从平面文件中删除CR LF

如何用<br />替换CR+LF?

CR, LF, CR/LF 回车 换行

CR, LF, CR/LF 回车 换行

为啥 CR LF 在 Windows 中改为 LF?

CR LF CR/LF