2017-06-13 339 views
0

我在Raspberry Pi上使用串行GPS/GNSS设备发现了一个问题。有问题的设备是一个符合/dev/gps的u-blox GNSS接收器。Linux:通过一个进程从串口读取数据,并用另一个进程写入数据

我试图实现记录来自该设备的输出数据并同时向其发送校正数据。更具体地说,我使用RTKLIB(http://www.rtklib.com/str2str工具来发送NTRIP/RTCM校正数据到GNSS接收器,以便使用DGNSS/RTK获得更好的位置估计。 接收器的输出数据将通过基于GPS deamon(gpsd)的python脚本进行记录。

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

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

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

回答

0

最后我发现了一个soultion使用以某种方式与此类似的结构:https://serverfault.com/questions/453032/socat-to-share-a-serial-link-between-multiple-processes

第一socat实例(A)获取GNSS校正从TCP连接,这是管道输送到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 

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

相关问题