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,只需将串行输出从 映射CR到CR+LF。
例子:
picocom /dev/ttyS0 --baud 19200 --omap crcrlf --echo
Run Code Online (Sandbox Code Playgroud)
现在实际上可以向设备发送命令了!
我猜 \xe2\x80\x9center\xe2\x80\x9d 你指的Return是键盘的键,\n可能标记为\xe2\x86\xb5。
\n简短回答:
\nputty、minicom、screen之所以在敲\n时会发送CR,Return是因为该Return键实际上意味着\n\xe2\x80\x9c回车\xe2\x80\x9d(CR)。
\necho和发送 LF 的原因printf("Hello, world!\\n");是\n因为它们以 结束输出\\n,这意味着 LF。请注意,这些程序不会敲击按键Return:它们甚至不会接触键盘。
长答案:
\n早在七十年代,我们就从tty过渡到基于 CRT 的\n计算机终端。早期终端的键盘带有单独的 CR 和 LF 键。在 DEC VT05上,它们被非常恰当地标记为\nCR和LF。在VT50和VT100系列上,\n它们被标记为RETURN和LINE 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
有些程序更喜欢自己处理终端:它们指示终端驱动程序不要进行字符转换(它们将其设置为 xe2x80x9crawxe2x80x9d 模式)并自己处理这些转换。大多数情况下,这是在诸如readline或ncurses之类的库中完成的。Bash 是这些程序之一(它使用 readline),但值得庆幸的是,它在其他exec()程序之前将终端重置为熟模式。
现在,假设您想要与某种在串行端口上朗读文本的设备进行通信。您走到阁楼,拿起已经积满灰尘近 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