通过 SSH 运行串行连接

通过 SSH 运行串行连接

编辑:经过这里的一些建议和额外的调查后,现在的情况如下:

我有一个串行设备,它以四个字节为一组进行输入,并以四个或八个字节为一组输出响应。

0x01010000 是我们想要发送到串行设备的第一个命令。

我知道 0x01fef40b0201080b 是正确的输出。如果我跑

echo -n -e "\x01\x01\x00\x00" | socat - /dev/ttyUSB0,raw,echo=0,b19200 > temp && hexdump temp

连接串行设备后我总是得到

0000000 01fe f40b 0201 080b

作为输出(第一批零来自hexdump),所以一切正常。

但是,如果我跑

socat -,raw /dev/ttyUSB0,raw,echo=0,b19200

直接在 Raspberry Pi 上的一个终端中,然后

echo -n -e "\x01\x01\x00\x00" | socat - /dev/ttyUSB0,raw,echo=0,b19200 > temp && hexdump temp

在另一个终端中(再次直接在 Raspberry Pi 上,因此没有 SSH 可能会破坏这里的东西!)不输出

0000000 01fe f40b 0201 080b

不再了。相反,我要么

  • 没有输出
  • 得到类似0000000 01fe 0002or 0000000 0b02 0008or 0000000 01fe 08f4or ... 的东西(所以总是错误并且比预期短)
  • 得到类似的东西0000000 01fe 0b02 0008(相同,但这次是三个字节)
  • 或者得到类似的东西,但是太短而且是错误的。

因此,似乎当我刚刚启动时socat -,raw /dev/ttyUSB0,raw,echo=0,b19200,没有向串行设备发送任何内容(至少是明确地),某些内容会中断并且我会得到错误的输出,就好像发送了某些内容导致了某种偏移一样(这就是响应变成的原因)突然太短了)。

但是,我已经运行strace socat -,raw /dev/ttyUSB0,raw,echo=0,b19200并在输出中找不到任何write命令,所以我不知道会发生什么。

所以这看起来像是破坏事物的东西socat,但我不知道它可能是什么。而且它似乎是纯粹的socat,没有任何 Windows 程序或 SSH 的参与。

编辑2:我刚刚发现如果我运行时socat没有给它提供任何输入,但strace它会退出而不是保持打开状态,例如

strace socat -,raw /dev/ttyUSB0,raw,echo=0,b19200 > strace3

然后当我跑步时

echo -n -e "\x01\x01\x00\x00" | socat - /dev/ttyUSB0,raw,echo=0,b19200 > temp && hexdump temp

再次,一切似乎都运行良好。所以看来,当socat没有破坏东西时,这并不是因为给它提供了输入,而是因为它终止了而不是保持打开状态。


考虑以下场景:

  1. 我们有一台 Windows PC(不用担心,它是等式中最小的部分,但正如您将看到的那样,它仍然是一个重要的细节)。
  2. 我们有一个串行设备。
  3. 我们有一个 Raspberry Pi,运行一些相当最新的 Raspbian。

我们希望 Windows PC 上的程序通过 SSH 连接到串行设备,也就是说,它应该通过 SSH 发送相同的数据,就好像设备通过 COM 连接一样,并且它应该通过 SSH 接收相同的数据,就好像设备通过 COM 连接一样。

我的解决方案想法涉及到 Raspberry Pi。串口设备连接到Raspberry Pi。在 Raspberry Pi 上,我们 SSH 的用户没有可见的提示,并且有一个登录 bash 脚本,可以直接启动屏幕终端到串行端口,这样该串行终端在连接时直接启动,事先没有控制台输出。这样,或者我想,我可以让 SSH 连接充当串行设备的直接隧道。

然而,事实证明,当我在这种配置下向串口设备发送命令时,得到的回报并不是我所期望的。

我现在的问题是:

  1. 这是否会失败,因为 SSH 无论如何都需要文本字符,并且无法处理例如字节字符串0x0000作为输入?我不知道这是否属实,这只是我的一个想法。
  2. 我在 Windows 机器上运行 SSH-tt旗帜。我这样做是因为否则我无法从 ssh 进程和我的程序进程中通过管道传输 stdin 和 stdout,以便我可以从 ssh 的 stdout 读取并写入其 stdin。难道 -tt 可能会破坏东西吗?
  3. 或者我关于如何做到这一切的整个想法从一开始就是完全错误的?

请记住,我不能诉诸诸如使用之类的解决方案重新序列化用于隧道,因为 PC 在 Windows 上运行(这就是为什么该细节很重要)。

感谢您花时间阅读本文。请告诉我是否应该将其发布到其他地方。

相关内容