首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >轮询uBlox MAX-6Q

轮询uBlox MAX-6Q
EN

Stack Overflow用户
提问于 2013-10-20 13:44:50
回答 1查看 2.8K关注 0票数 0

我目前正在做一个HAB (高空气球)项目,到目前为止,一切都进展顺利。

我正在使用一个Arduino uno R3作为我的主要控制器,然而,我在这里的东西的全球定位系统方面的斗争。

关于英国的奇妙教程-有(http://ukhas.org.uk/guides:ublox6),我目前正在与uBlox最大-6Q全球定位系统模块工作。

我已经使用了教程中提供的代码,并且正在用下面的草图进行测试:

代码语言:javascript
复制
#include <SoftwareSerial.h>
SoftwareSerial GPS(3,2);
byte gps_set_success = 0;

void setup()
{
  Serial.begin(9600);
  GPS.begin(9600);
  GPS.print("$PUBX,41,1,0007,0003,4800,0*13\r\n"); 
  GPS.begin(4800);
  GPS.flush();
  uint8_t setNav[] = {
    0xB5, 0x62, 0x06, 0x24, 0x24, 0x00, 0xFF, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00,                     0x10, 0x27, 0x00, 0x00, 
    0x05, 0x00, 0xFA, 0x00, 0xFA, 0x00, 0x64, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xDC };
    /*while(!gps_set_success)
    {
      sendUBX(setNav, sizeof(setNav)/sizeof(uint8_t));
      gps_set_success = getUBX_ACK(setNav);
    }*/
    gps_set_success = 0;
  GPS.println("$PUBX,40,GGA,0,0,0,0*5A");
  GPS.println("$PUBX,40,GSA,0,0,0,0*4E");
  GPS.println("$PUBX,40,RMC,0,0,0,0*47");
  GPS.println("$PUBX,40,GSV,0,0,0,0*59");
  GPS.println("$PUBX,40,VTG,0,0,0,0*5E");
  GPS.println("$PUBX,40,GLL,0,0,0,0*5C");
}

void loop()
{
  printGPSData();
  delay(3000);
}

void printGPSData()
{
  Serial.println("Polling: $PUBX,00*33");
  GPS.println("$PUBX,00*33");
  while (GPS.available())
  {
    if (GPS.available() > 0)
    {
      char c = GPS.read();
      Serial.write(c);
    }
  }
  Serial.println();
}

void sendUBX(uint8_t *MSG, uint8_t len)
{
  for (int i = 0; i<len; i++)
  {
    GPS.write(MSG[i]);
    Serial.print(MSG[i], HEX);
  }
  GPS.println();
}

boolean getUBX_ACK(uint8_t *MSG)
{
  uint8_t b;
  uint8_t ackByteID = 0;
  uint8_t ackPacket[10];
  unsigned long startTime = millis();
  Serial.print(" * Reading ACK response: ");

  ackPacket[0] = 0xB5;
  ackPacket[1] = 0x62;
  ackPacket[2] = 0x05;
  ackPacket[3] = 0x01;
  ackPacket[4] = 0x02;
  ackPacket[5] = 0x00;
  ackPacket[6] = MSG[2];
  ackPacket[7] = MSG[3];
  ackPacket[8] = 0;
  ackPacket[9] = 0;

  for (uint8_t i=2; i<8; i++)
  {
    ackPacket[8] = ackPacket[8] + ackPacket[i];
    ackPacket[9] = ackPacket[9] + ackPacket[8];
  }

  while(1)
  {
    if (ackByteID > 9)
    {
      Serial.println("(SUCCESS!)");
      return true;
    }

    if (millis() - startTime > 3000)
    {
      Serial.println("(FAILED!)");
      return false;
    }

    if (GPS.available())
    {
      b = GPS.read();
      if (b == ackPacket[ackByteID])
      {
        ackByteID++;
        Serial.print(b,HEX);
      }
      else
      {
        ackByteID = 0;
      }
    }
  }
}

我一直在努力解决两个问题。我在getUBX_ACK方法中点击超时,这意味着,没有来自GPS模块的响应来确认设置更改。这并不是目前的关键,如果需要是,我可以通过uCenter配置这一点,并添加电池,以保留设置。

但是,我面临的主要问题是,当我在设置中使用setNav块运行这个草图时,我可以关闭所有的自动NMEA语句,并对模块进行轮询,但是在投票时,我会受到以下的欢迎:

代码语言:javascript
复制
Polling: $PUBX,00*33

后面跟着一些无效的字符。(矩形)

我已经检查了波特率、停止位、奇偶校验等,以及实际的数据线连接,但似乎找不到这方面的来源。它给我暗示了糟糕的数据线/编码/对我来说,但我想知道这是否是其他人曾经经历过的事情?

编辑:

因此,经过更多的测试后,似乎SoftwareSerial库在这里并没有错。我首先尝试使用OpenLog GPS ipput编写SoftwareSerial,然后将SoftwareSerial Tx直接连接到OpenLog Rx。同样的故事。在Notepad++中打开结果文件将产生一堆可爱的'NULL‘字符。我只能假设在运行时配置GPS的方式会导致问题。

绕过Arduino,关闭句子,直接通过串行工作轮询GPS,没有任何问题,数据被完美地返回。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-21 19:49:23

所以,我觉得有点傻,有一个问题,但不是全球定位系统,我会问一个单独的问题。看来我在SoftwareSerial库上遇到了问题。

SoftwareSerial库不能同时使用多个软串行端口,似乎尽管有许多其他建议,但我不能在sof串行端口之间切换,因为我无法开始()第二个端口,似乎第一个声明的端口是不可用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19478075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档