【问题标题】:Reading synchronised data from 2 serial USB ports concurrently in Python. Threading? Multiprocessing?在 Python 中同时从 2 个串行 USB 端口读取同步数据。穿线?多处理?
【发布时间】:2020-12-21 07:53:16
【问题描述】:

我正在使用 RTK GPS 导航构建由 Raspberry Pi 控制的自动漫游车。我在流动站上使用两个独立的 U-Blox RTK GPS 模块以 4Hz 运行,以获得非常准确的位置和航向计算,它们都通过 USB 端口连接到 Pi。我正在使用 pyserial 库来读取通过 USB 输出的 NMAE 语句。我遇到的问题是每个模块发送的串口数据是精确同步的,所以在一个端口调用 Serial.readline() 时,发送到另一个端口的数据丢失了。

代码的基础目前看起来像这样:

`class GPS():
      def __init__(self,port,baud):
          self.gpsSerial = serial.Serial(port,baud)
          # init some variables
          return

      def read(self):
          NMEASentance = str(self.gpsSerial.readline())
          if NMEASentance not what_i_wanted_or_blank:
              return 0
          # do some processing, update vars
          return 1

frontGps = GPS(port1,baud)
rearGps = GPS(port2,baud)

while True:
    if frontGps.read():
       # grab the new data
    if rearGps.read():
       # grab the new data

最终发生的情况是,当一个串行端口正在被读取并处理数据时,另一个正在同时传输并且丢失了。我试过一个接一个地进行两次读取,然后将处理留待以后处理,但问题仍然存在。 如何同时读取两个端口?将每个串行读取工作线程化(它们仍将在同一进程中运行,因此不会同时执行,对吗?) 如果解决方案是多处理,那么有人可以发布一些框架代码供我遵循,因为这个问题真的让我很头疼。 感谢您的帮助!

【问题讨论】:

  • 请问您为什么有 2 个 GPS?您是否考虑过使用单独的进程来馈送gpsdlinux-magazine.com/Issues/2018/210/Tutorial-gpsd
  • 我使用了两个,以便始终知道流动站的精确方向。借助基站,它可以提供流动站上两个固定点的 GPS 位置,精度为厘米,从而提供方向(甚至俯仰)。我使用 GPS 和指南针为之前的迭代编写的 Python 代码运行良好,但使用指南针会带来一些问题,例如对电机产生的磁场敏感并且必须定期校准。我玩过 gpsd,但没有花时间尝试集成它。我希望快速修复 python 代码
  • 我不确定是什么导致了问题,所以不要浪费太多时间遵循我的(猜测的)建议,但如果没有其他人回答并且你有时间......你可能会考虑从您当前的主进程中启动 2 个新的、独立的 Python 进程。首先创建两个多处理队列,并为每个新的 Python 进程传递一个队列,让每个新进程在循环中简单地重复读取 GPS,并将它们进入的任何内容写入队列以供主进程获取。只是让 2 个 GPS 单元非常独立的想法。
  • @MarkSetchell 谢谢,明天早上我会试一试。这听起来像是一个很有前途的解决方案!
  • @MarkSetchell 宾果游戏!设置两个进程以从串行端口读取并将它们添加到共享队列。按预期工作,谢谢!

标签: python raspberry-pi python-multiprocessing python-multithreading pyserial


【解决方案1】:

希望得到一些关于此的代码: 设置两个进程从串口读取并将它们添加到共享队列中

我有一个 GPS 串行环路正在运行,需要为磁力计添加第二个串行链路,并且需要一种方法将两个流分开

目前,使用 Neo6M GPS 并注意到 #GPRMC 消息就像在每个 UTC 秒滴答声中每秒传输一次的心跳。

#GPRMC 是传输 UTC 时间/日期的 GPS 标准语句 (以及位置、速度和航向)所以它会在 UTC 秒 = 00.00 时传输是有道理的

在阅读了这个问题后,我想到所有的 GPS 接收器可能都在做同样的事情。因此,如果您启动了任意数量的它们,它们都会被同步。

如果我的理论是正确的: 支持 GPS 的 pi 士兵机器人大军即使相隔大陆,也可以步调一致。

【讨论】:

  • 不幸的是,我目前没有代码。据我所知,我首先配置了 gps,以便仅串行输出 RMC 和 GGA NMEA,从而显着降低负载(每秒仅约 8 个字符串)。我创建了一个多处理 GPS 类,它初始化串行连接,然后在每个循环的 run 方法中,我执行 serial.read(1) 等待接收到一个字节,然后 serial.readline() 捕获字符串的其余部分,处理它并将相关数据放入队列中。产生其中两个允许我捕获通过两个串行端口发送的所有内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多