编辑:经过这里的一些建议和额外的调查后,现在的情况如下:
我有一个串行设备,它以四个字节为一组进行输入,并以四个或八个字节为一组输出响应。
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 0002
or0000000 0b02 0008
or0000000 01fe 08f4
or ... 的东西(所以总是错误并且比预期短) - 得到类似的东西
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
没有破坏东西时,这并不是因为给它提供了输入,而是因为它终止了而不是保持打开状态。
考虑以下场景:
- 我们有一台 Windows PC(不用担心,它是等式中最小的部分,但正如您将看到的那样,它仍然是一个重要的细节)。
- 我们有一个串行设备。
- 我们有一个 Raspberry Pi,运行一些相当最新的 Raspbian。
我们希望 Windows PC 上的程序通过 SSH 连接到串行设备,也就是说,它应该通过 SSH 发送相同的数据,就好像设备通过 COM 连接一样,并且它应该通过 SSH 接收相同的数据,就好像设备通过 COM 连接一样。
我的解决方案想法涉及到 Raspberry Pi。串口设备连接到Raspberry Pi。在 Raspberry Pi 上,我们 SSH 的用户没有可见的提示,并且有一个登录 bash 脚本,可以直接启动屏幕终端到串行端口,这样该串行终端在连接时直接启动,事先没有控制台输出。这样,或者我想,我可以让 SSH 连接充当串行设备的直接隧道。
然而,事实证明,当我在这种配置下向串口设备发送命令时,得到的回报并不是我所期望的。
我现在的问题是:
- 这是否会失败,因为 SSH 无论如何都需要文本字符,并且无法处理例如字节字符串0x0000作为输入?我不知道这是否属实,这只是我的一个想法。
- 我在 Windows 机器上运行 SSH-tt旗帜。我这样做是因为否则我无法从 ssh 进程和我的程序进程中通过管道传输 stdin 和 stdout,以便我可以从 ssh 的 stdout 读取并写入其 stdin。难道 -tt 可能会破坏东西吗?
- 或者我关于如何做到这一切的整个想法从一开始就是完全错误的?
请记住,我不能诉诸诸如使用之类的解决方案重新序列化用于隧道,因为 PC 在 Windows 上运行(这就是为什么该细节很重要)。
感谢您花时间阅读本文。请告诉我是否应该将其发布到其他地方。