1

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

XBee 目前使用硬件UART并且工作正常。GPS 模块和数字罗盘都使用软件串行。

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

下面是我的示例代码。

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 现在可以工作,但数字罗盘不能。我认为软件序列号有问题。解决办法是什么?

4

5 回答 5

2

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

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

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

于 2012-11-16T11:18:02.483 回答
1

您的 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

于 2012-08-06T12:59:44.730 回答
1

根据Ardiuno 文档

该库具有以下已知限制:

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

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

于 2012-06-14T14:51:58.480 回答
0

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

于 2013-04-17T18:36:32.387 回答
0

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

mySerial.listen()

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

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

于 2012-10-25T00:12:50.520 回答