Linux: 一个进程从串口读取数据,另一个进程写入

Linux: Read data from serial port with one process and write to it with another

我在 Raspberry Pi 上使用串行 GPS/GNSS 设备时遇到问题。有问题的设备是符号链接到 /dev/gps 的 u-blox GNSS 接收器。

我尝试实现记录此设备的输出数据并同时向其发送校正数据。

更具体地说,我使用 RTKLIBs (http://www.rtklib.com/) str2str 工具向 GNSS 接收器发送 NTRIP/RTCM 校正数据,以便使用 [=29 获得更好的位置估计=]. 接收器的输出数据将由基于 GPS 守护程序 (gpsd) 的 python 脚本记录。

不过,我想主要是串口控制的问题。 当我先 运行 写入进程 (str2str) 然后再读取任何进程(我的 python script/gpsd 前端(例如 cgps)/cat)同时,读取进程将输出数据几秒钟然后冻结。使用哪种工具读取数据并不重要。

我发现了这个问题:https://superuser.com/questions/488908/sharing-a-serial-port-between-two-processes. Therefore I made sure that the processes got rw access to the device and even tried running them as superuser. Furthermore I stumbled upon socat and virtual serial ports, but didn't find any use for it. (Virtual Serial Port for Linux)

有什么方法可以用一个进程从串行端口读取数据并用另一个进程写入数据吗?我现在知道的唯一解决方案可能是使用 pySerial 重写 python 中的读写过程。这将允许只有一个进程访问串行设备,但这意味着大量的工作。

最后我找到了一个使用类似于此结构的灵魂:https://serverfault.com/questions/453032/socat-to-share-a-serial-link-between-multiple-processes

第一个 socat 实例 (A) 从 TCP 连接获取 GNSS 校正数据,该数据通过管道传输到 socat B。Socat B 管理与串行设备的连接并将输出数据通过管道传输到另一个 socat 实例 C,这允许其他gpsd 等进程连接并从 TCP 端口获取接收器的输出。

总的来说,这看起来像:

socat -d -d -d -u -lpA   TCP4:127.0.0.1:10030 - 2>>log.txt | 
socat -d -d -d -t3 -lpB  - /dev/gps,raw  2>>log.txt|
socat -d -d -d -u -lpC   - TCP4-LISTEN:10031,forever,reuseaddr,fork 2>>log.txt

只有一个进程管理串行连接,它不再阻塞。