我目前正在做一个项目,我将GPS模块,数字罗盘和ZigBee(XBee调制解调器)连接到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现在可以正常工作,但数字指南针不会。我认为Software Serial有问题。解决方案是什么?
答案 0 :(得分:1)
该库具有以下已知限制:
如果使用多个软件串口,则只有一个可以接收数据 一段时间。
因此,您似乎必须添加代码以在每个软件序列的采样之间切换。 我知道GPS会在第二时间间隔播出。因此,在获得有效的GPS读取后,断开它,然后观察指南针,直到下一次预定的GPS。一个研究问题是初始化事物和保持代码足够有效所需的时间。
答案 1 :(得分: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
答案 2 :(得分:1)
一个问题:您是否考虑过为您的项目使用Arduino Mega?使用此电路板,您可以获得4个(实际)硬件UART,这对于您的目的来说应该足够了。
使用“软件序列”库太棘手了。它在某些情况下可能正常工作,但与普通串行端口相比具有重要的局限性,并且极有可能引发数据丢失。
在管理多个串行设备时,我不建议您花更多时间进行“串行仿真”。只需要一个更好的微控制器,就是这样。
答案 3 :(得分:0)
要设置要侦听的SoftwareSerial端口,请使用
mySerial.listen()
这意味着您必须在设置listen()
后等待消息到达。通过选中mySerial.available()>0
缺点是您错过了来自其他设备的消息,因此良好的程序设计变得非常重要。但我相信你知道:)
答案 4 :(得分:0)
您应该从GPS接收器读取一行文字,然后使用this->compassSerial->listen()
切换回指南针,然后再切换回GPS。你会丢失一些报告,但这可能不是你的约束。