【问题标题】:How to utilize multiple software serial in libraries in Arduino?如何在 Arduino 的库中使用多个软件序列?
【发布时间】:2012-06-14 04:32:48
【问题描述】:

我目前正在做一个项目,我将 GPS 模块、数字罗盘和 ZigBeeXBee 调制解调器)连接到 Arduino。顺便说一句,我使用Eclipse IDE 来做这个项目,所以我把我的代码分解成几个库。

XBee 当前使用硬件UART 并且工作正常。 GPS模块和数字罗盘都使用Software Serial。

我的问题是,如果我同时实例化两个软件序列,那么只有最新的可以工作。

下面是我的示例代码。

void CSensor::initSensors()
{
    //For GPS
    this->gpsSerial = new SoftwareSerial(2, 3);
    this->gpsSerial->begin(9600);

    //For digital compass
    this->compassSerial = new SoftwareSerial(6, 7);
    this->compassSerial->begin(9600);
}

gpsSerial 被声明为CSensor 类的指针成员。 ->SoftwareSerial* gpsSerial; compassSerial 也被声明为相同 -> SoftwareSerial* compassSerial;

在上面的示例代码中,只有数字罗盘可以工作,GPS 不能工作。但是如果我交换代码的位置,它会看起来像这样:

void CSensor::initSensors()
{
    //For digital compass
    this->compassSerial = new SoftwareSerial(6, 7);
    this->compassSerial->begin(9600);

    //For GPS
    this->gpsSerial = new SoftwareSerial(2, 3);
    this->gpsSerial->begin(9600);
}

GPS 现在可以工作,但数字罗盘不能。我认为软件序列号有问题。解决办法是什么?

【问题讨论】:

    标签: gps serial-port arduino


    【解决方案1】:

    一个问题:您是否考虑过在您的项目中使用 Arduino Mega?使用此板,您可以获得 4 个(真正的)硬件 UART,这对于您的目的应该足够了。

    使用“软件串行”库太棘手了。它在某些情况下可以正常工作,但与普通串口相比有很大的局限性,而且很可能会导致数据丢失。

    在管理多个串行设备时,我不建议您花更多时间在“串行仿真”上。只需要一个更好的微控制器,仅此而已。

    【讨论】:

      【解决方案2】:

      根据Ardiuno documentation

      该库具有以下已知限制:

      如果使用多个软件串口,只有一个可以接收数据 一次。

      所以看起来您必须添加代码才能在每个软件序列的采样之间切换。 我知道 GPS 每隔一秒就会广播一次。所以也许在获得有效的 GPS 读数后,断开它,然后观察指南针,直到下一个预定的 GPS。一个研究问题是初始化事物并保持代码足够高效需要多长时间。

      【讨论】:

        【解决方案3】:

        您的 SoftwareSerial 很好。就像 jdh 说的,Arduino 一次只能读取一个软件序列。但如果您使用的是 Sparkfun GPS,您实际上可以将 UART 用于 GPS(通过使用 UART/Dline 开关并将 RX/TX 引脚编号分别从 2、3 更改为 0 和 1)。

        为此,请将开关保持在 dline 上并上传代码。在此之后将其更改回 UART,以便 Arduino 可以从 GPS 读取。这将工作得很好。

        有关更多详细信息,请查看 GPS 教程的 UART 部分。 http://www.sparkfun.com/tutorials/173

        【讨论】:

        • 我发现我的 UART 在引脚 0、1 而不是 2、3 上,正如网站所说。只是为可能登陆这里的人说。
        【解决方案4】:

        设置使用哪个 SoftwareSerial 端口来侦听

        mySerial.listen()
        

        这意味着您必须在设置listen() 后等待消息到达。通过检查mySerial.available()>0来做到这一点

        缺点是您会错过来自其他设备的消息,因此良好的程序设计变得非常重要。但我相信你知道:)

        【讨论】:

          【解决方案5】:

          您应该从 GPS 接收器读取一行文本,然后使用 this->compassSerial->listen() 切换回指南针,然后切换回 GPS。您会丢失一些报告,但这对您来说可能不是一个限制因素。

          【讨论】:

          • 当您达到一定的基本声誉时,您将能够对答案进行投票。请不要发布不是真正答案的答案。现在,我将删除评论部分。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多