当我按下回车键时,PuTTY发送了什么?

15
我正在拼命尝试将蓝牙 dongle 与我的 Arduino 配对,但我无法发送它所需的命令。当我通过 USB 转 UART 芯片将其插入电脑并使用 PuTTY 发送命令 (C) 并按下 Enter 后,我可以使用它。
蓝牙 dongle 的command sheet显示我要发送的命令是 C<cr>,但我无法在 Arduino 代码中发送正确的回车符号。我已经尝试使用 Serial.println() 函数以及将 \r 字符添加到当前的 Serial.write("C\r") 中,但这两者都不起作用。
我该如何实现这一点?

1
请检查您的Putty终端设置,以查看它设置为发送什么内容;您可以配置它发送任何行尾。 - Wooble
1
@Wooble,"PuTTY重新配置"在哪里可以找到? - Sponge Bob
9个回答

14

有趣的是,在 Windows 7 上,对于我和我的嵌入式项目而言,PuTTY 只会通过 COM 端口发送 \r。很奇怪,也很难解释,但我只需要在串行连接的另一端寻找这两个字符之一即可。

然后,如果您在终端选项下启用“每个 CR 中的隐式 LF”,它将同时发送 \r\n。默认行为似乎类似于 Commodore 机器 :D (http://en.wikipedia.org/wiki/Newline)。谁知道...


刚遇到这个问题,感谢提到隐式LF设置。 - Daniel Buckmaster
1
我也遇到了这个问题。在将其连接到我的PIC之前,我很高兴先进行了检查;正如其他人的帖子所显示的那样,这是非常意外的。我的示波器清楚地显示Putty的默认设置仅发送\r。这并没有记录在文档中。 - carveone
@carveone,我在这里找到了文档(http://the.earth.li/~sgtatham/putty/0.63/htmldoc/Chapter4.html#config-telnet),请看第4.6.14节:<br/> 默认情况下,PuTTY在按回车键时发送Telnet新行代码,而不是像大多数其他协议一样发送Control-M。 - tsul
但这只适用于 Telnet 连接,而不是串行连接。但这整个与 \r 有关的事情确实解释了为什么我看到的协议以 \r 结尾而不是 \n。它确实表明,一个人必须非常小心,不要对任何事情做任何假设 :-) ESP8266 dongle 需要 cr-lf,你必须使用 enter 键和 ctrl-J。如果你在谷歌上搜索一下,你会看到有多少人被这个问题搞糊涂了。Enter 键是 CR,不是 LF... - carveone
10
不,“每个回车都有隐式换行符”并不能实现这一点。原版PuTTY中没有选项在按下回车键时发送LF。 - grzegorz

10

8

PuTTY是一个模拟终端的软件,它模拟了xterm和vt100终端。在使用PuTTY连接串行设备后,如果想让PuTTY在按下回车键时发送CR/LF,请输入ESC[20h指令,这将设置VT100的LNM为true。

http://vt100.net/docs/vt100-ug/chapter3.html

换行符/新行符:新行 ESC [20h 换行符 ESC [20l


这个可以运行!但是它能被保存在会话中吗,这样我就不必在每次启动会话时重新输入它了吗? - habakuk
我该如何准确地输入“ESC[20h”?是6个字母吗? - Osman-pasha
转义键(Esc)[2 0 h(五个字符) 控制序列 - bubbasnmp

2
如果你查看ASCII表或类似的参考资料,你可能会发现有趣的内容:\r 或 \x0D。
为了更好地理解,请参见:http://www.grok2.com/sedfaq6.html

2
修改后的PuTTY是最简单的解决方案。如果您想继续使用标准PuTTY,还有其他选择...... 在按回车键之前,您可以使用ctrl+j发送换行符,但这很麻烦。 要自动化它,您可以使用AutoHotKey在PuTTY窗口处于活动状态时将{ENTER}更改为^J {ENTER}:
#if WinActive("ahk_exe putty.exe")
    Enter::
        SendInput ^J{Enter}
    Return
#if

如果你只想针对一个PuTTY窗口进行操作,你可以告诉AHK窗口的名称:

#if WinActive("COM8 - PuTTY")
    Enter::
        SendInput ^J{Enter}
    Return
#if

1
在Arduino编程中,只需要使用Serial.write和两个字符代码即可:
Serial.write(13);    // CR
Serial.write(10);    // LF

避免使用Serial.print,因为它是用于人类阅读的,所以需要进行格式化。
参考资料:write print

1
在标准配置下(在Windows和Linux上),如果您键入“help”,然后按回车键,以下字节序列将出现在串口上(通过RS232连接的外部终端和逻辑分析仪进行检查):
0x68(h) 0x65(e) 0x6c(l) 0x70(p) 0x0d(CR: 回车符 U+000D)
因此,看起来PUTTY会在ENTER时添加CR(无论您是在Linux还是Windows上)。

-1

我尝试了这个非常简单的代码(CR代表回车)

Serial.write(13);

因为下一个“打印”的字符将会填充剩余的文本,所以没问题。


-1

我几乎可以确定你正在寻找换行符\n


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接