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

时间:2017-06-13 13:46:14

标签: linux raspberry-pi serial-port gpsd

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

我尝试从该设备记录输出数据并同时向其发送校正数据。

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

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

我发现了这个问题:https://superuser.com/questions/488908/sharing-a-serial-port-between-two-processes。因此,我确保进程可以通过rw访问设备,甚至尝试以超级用户身份运行它们。此外,我偶然发现了socat和虚拟串口,但没有找到任何用途。 (Virtual Serial Port for Linux

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

1 个答案:

答案 0 :(得分:0)

最后,我发现了一个使用与此类似的构造的灵魂: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

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