0

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

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

更具体地说,我使用 RTKLIBs ( 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 和虚拟串行端口,但没有发现任何用处。(Linux 的虚拟串行端口

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

4

1 回答 1

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

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

于 2017-06-20T10:50:42.257 回答