Gps 如何在Arduino中利用多个串行软件库?

Gps 如何在Arduino中利用多个串行软件库?,gps,serial-port,arduino,Gps,Serial Port,Arduino,我目前正在做一个项目,将GPS模块、数字指南针和调制解调器连接到Arduino。顺便说一句,我正在使用IDE来完成这个项目,所以我将代码分解为几个库 XBee目前正在使用硬件,并且工作正常。GPS模块和数字罗盘均使用串行软件 我的问题是,如果我实例化这两个软件序列,只有最新的一个可以工作 下面是我的示例代码 void CSensor::initSensors() {    //For GPS    this->gpsSerial = new SoftwareSerial(2, 3);

我目前正在做一个项目,将GPS模块、数字指南针和调制解调器连接到Arduino。顺便说一句,我正在使用IDE来完成这个项目,所以我将代码分解为几个库

XBee目前正在使用硬件,并且工作正常。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类的指针成员。->软件系列*gpsSerial;compassSerial也声明为相同->软件序列*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读数后,断开连接,然后观察指南针,直到下一个计划的GPS。一个研究问题是需要多长时间来初始化代码并保持足够的效率。

根据:

该库具有以下已知限制:

如果使用多个软件串行端口,则一次只能有一个端口接收数据 一段时间

因此,看起来您必须添加代码,以便在每个软件序列的采样之间切换。
我知道全球定位系统每隔一秒广播一次。因此,在获得有效的GPS读数后,断开连接,然后观察指南针,直到下一个计划的GPS。一个研究问题是需要多长时间来初始化代码并保持足够的效率。

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

为此,请将开关保持在dline上并上载代码。在此之后,将其更改回UART,以便Arduino可以从GPS读取数据。这就行了

有关更多详细信息,请查看GPS教程的UART部分。

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

为此,请将开关保持在dline上并上载代码。在此之后,将其更改回UART,以便Arduino可以从GPS读取数据。这就行了

有关更多详细信息,请查看GPS教程的UART部分。
设置要侦听的软件串行端口

mySerial.listen()
这意味着您必须在设置“侦听”后等待消息到达。通过检查mySerial.available>0来执行此操作


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

设置要侦听的软件串行端口

mySerial.listen()
这意味着您必须在设置“侦听”后等待消息到达。通过检查mySerial.available>0来执行此操作


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

一个问题:你有没有考虑过在你的项目中使用Arduino Mega?有了这个电路板,你可以得到4个真正的硬件UART,这对于你的目的应该足够了

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


在管理多个串行设备时,我不建议您花更多时间进行串行模拟。只需要一个更好的微控制器,就可以了。

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

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


在管理多个串行设备时,我不建议您花更多时间进行串行模拟。只需使用更好的微控制器即可。

您应该从GPS接收器读取一行文本,然后使用此->compassSerial->listen->切换回指南针
n回到全球定位系统。您将丢失一些报告,但这可能不是您的限制。

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

我发现我的UART位于引脚0、1上,而不是站点所说的引脚2、3上。我发现我的UART是在引脚0,1上的,而不是网站上说的2,3上的。我只是想为可能在这里登陆的人说一句话。当你达到一定的基本声誉时,你将能够投票决定一个答案。请不要发布不是真正答案的答案。现在,我将删除评论部分。当你达到一定的基本声誉时,你将能够对答案进行投票。请不要发布不是真正答案的答案。现在,我将删除注释部分。