串行端口上的错误换行符(CR 而不是 LF)

Chr*_*phK 9 linux serial-port newlines

我正在尝试在 linux 上使用 USB 到串行转换器与设备通话。驱动程序正在运行,设备存在于 /dev/ttyUSB0。

有一个奇怪的问题(用空调制解调器电缆检查到另一台计算机):无论我使用什么程序连接到设备(腻子、minicom、屏幕),它们都会在输入时发送 CR (\r)。我(和我的设备)在输入时期望 LF (\n)。

当我使用控制台发送命令时 - 它发送一个 LF:

# echo Hello World > /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)

结果为“Hello World\n”。我还编写了经典的 c hello world 程序(printf("Hello, world!\n");)并将输出重定向到 /dev/ttyUSB0 - 在该行的另一端也给了我一个“Hello world\n” .

但是所有其他终端程序在输入时都会发送一个 \r 。

这里发生了什么?

小智 12

如果使用picocom,只需将串行输出从 映射CRCR+LF

例子:

picocom /dev/ttyS0 --baud 19200 --omap crcrlf --echo
Run Code Online (Sandbox Code Playgroud)

现在实际上可以向设备发送命令了!

  • 我正在寻找一般的解释/解决方案。正如我在问题中提到的,我可以用 C 编写自己的程序,该程序可以工作(确实发送 LF)。无论如何,您的回答可能对其他人有帮助...... (2认同)

Edg*_*net 5

我猜 \xe2\x80\x9center\xe2\x80\x9d 你指的Return是键盘的键,\n可能标记为\xe2\x86\xb5

\n

简短回答:

\n

putty、minicom、screen之所以在敲\n时会发送CR,Return是因为该Return键实际上意味着\n\xe2\x80\x9c回车\xe2\x80\x9d(CR)。

\n

echo和发送 LF 的原因printf("Hello, world!\\n");是\n因为它们以 结束输出\\n,这意味着 LF。请注意,这些程序不会敲击按键Return:它们甚至不会接触键盘。

\n

长答案:

\n

早在七十年代,我们就从tty过渡到基于 CRT 的\n计算机终端。早期终端的键盘带有单独的 CR 和 LF 键。在 DEC VT05上,它们被非常恰当地标记为\nCRLF。在VT50VT100系列上,\n它们被标记为RETURNLINE FEED。后来\n模型放弃了LINE FEED钥匙,我们最终得到了\nReturn并且没有 LF 的钥匙。如今,这些笨重的终端\n已被 rxvt 或 gnome-terminal 等终端模拟器所取代。\n但是,顾名思义,终端模拟器的工作是 \nxe2\x80\xa6 来模拟终端!因此,情况并没有太大变化:\nReturn键仍然代表 CR,就像 1975 年一样。

\n

另一方面,Unix 标准化使用 LF 作为行尾\指示符。在文本文件和用户空间程序中,文本行总是以 LF 结尾。这就引出了一个问题:我们如何使用终端与 Unix 系统进行交互,从而使发送 LF 比发送 CR 更加困难?答案是\xe2\x80\xa6,这取决于我们正在与之交互的特定\n程序。

\n

当我们与 \xe2\x80\x9cnaive\xe2\x80\x9d 程序交互时,或者更确切地说,与\n不费心处理终端的程序交互时,内核中的终端驱动程序是 \nin \xe2\x80\x9ccanonical \xe2\x80\x9d(或 \xe2\x80\x9ccooked\xe2\x80\x9d)模式。在此模式下,它将来自终端的 CR\n字符转换为 LF,并将传出的 LF 转换为 CR+LF\n序列。这些翻译可以被视为的输出中的icrnl和\n标志。onlcrstty -a

\n

有些程序更喜欢自己处理终端:它们指示终端驱动程序不要进行字符转换(它们将其设置为 xe2x80x9crawxe2x80x9d 模式)并自己处理这些转换。大多数情况下,这是在诸如readlinencurses之类的库中完成的。Bash 是这些程序之一(它使用 readline),但值得庆幸的是,它在其他exec()程序之前将终端重置为熟模式。

\n

现在,假设您想要与某种在串行端口上朗读文本的设备进行通信。您走到阁楼,拿起已经积满灰尘近 30 年的旧VT420 。您使用交叉 (\xe2\x80\x9cnull-modem\xe2\x80\x9d) 电缆将其连接到\n设备,然后瞧\xc3\xa0!您的设备\n有一个终端!多么酷啊?希望这个设备\n被设计为能够与经典终端很好地配合:它需要\nCR 终止的消息。如果它需要 LF,那么您必须通过键入Ctrl-来结束行J,因为 VT420 没有专用LINE FEED键。

\n

如果您没有这些可爱的老式终端,您可以使用\n模拟终端,例如 gnome-terminal 或Cool-retro-term。\n您可以使用通信程序(例如\nminicom)将其连接到您的设备,或picocom,以及 USB 转串口转换器。在默认配置中,这些通信程序不会干扰您的数据流:它们以原始模式(两端)配置 tty 驱动程序,并在您的模拟终端和设备之间忠实地转发字节,就像空调制解调器电缆可以与您的 VT420 配合使用。\n但与空调制解调器电缆不同的是,picocom 可以配置为在需要时动态转换\n线路结尾。

\n