免责声明:长而详细的问题描述 + 我其实不知道socat
,但遇到了一个非常奇怪的问题。类似于最后的 tl;dr。
我目前正在尝试将运行 Ubuntu 18.04 的计算机串行(RS232)连接到 INS(特别是 Ellipse-D),以向其发送 RTCM 校正数据,以便它能够达到 RTK 级 GPS 精度。
为此,BKG Ntrip 客户端 (BNC) 在我的计算机上运行,它期望通过串行接口从 INS 发送 NMEA 字符串,通过互联网将它们发送到 NTRIP 播送器,后者又将 RTCM 校正数据发送回 NTRIP 客户端,以便后者可以将接收到的校正数据通过串行接口传递给INS。 (下图为说明图。)
现在不幸的是,INS 总是表明它没有接收到校正数据,但 BNC 总是从 INS 接收 NMEA 字符串,以及来自 NTRIP 脚轮的 RTCM 数据。因此,我决定尝试监视串行端口(在我的例子中为 /dev/ttyUSB0)上的流量,以查看 RTCM 数据是否正在离开计算机。因此,我找到了以下条目:
如何监控串口流量?
因此,我转换了那里描述的解决方案,它使用socat
,如上所述运行我的系统,同时打开另一个终端,在其中执行以下命令:
socat /dev/ttyUSB0,raw,echo=0 \
SYSTEM:'tee in.txt |socat - "PTY,link=/tmp/ttyV0,raw,echo=0,waitslave" |tee out.txt'
我预计传入流量最终会到达in.txt
,传出流量最终会到达out.txt
。里面in.txt
有来自 INS 的 NMEA 字符串,但里面out.txt
什么也没有。一开始我很失望,直到我注意到我的 INS 突然指示要估计 RTK 级 GNSS 位置,所以突然 RTCM 校正数据降落在 INS 上。更令我惊讶的是,当我取消socat
终端命令时,RTK 级精度也不再存在,因此不再有 RTCM 数据到达 INS。我重复了这个过程几次,结果总是一样,所以可以排除巧合。 (唯一有趣的是,一段时间后,RTK 水平精度不再达到,但重新启动 socat 命令后,立即再次达到)。
长话短说:为了结束这个冗长的问题描述,我问我自己,也问你,上述命令的哪些副作用socat
导致了这样一个事实:除了 socat 之外的另一个程序(这里是 BNC)只能通过串行接口将数据发送到外部设备(这里是 INS) ifsocat
监视此接口(此处为 /dev/ttyUSB0),因为在我的应用程序中我不想socat
始终并行运行。
BNC 在 Ubuntu 18.04 机器上运行,这里的 GNSS 流动站是 Ellipse-D INS。要串行传输的参考观测值是问题所在,因为它们似乎只有socat
在同时执行上述命令时才会到达。另一方面,NMEA 坐标始终到达,无论socat
.