我在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中的读写过程。这将允许只有一个进程访问串行设备,但意味着大量的工作。
答案 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
只有一个进程管理串行连接,它不会再阻塞。