C 轮询uBlox MAX-6Q

C 轮询uBlox MAX-6Q,c,serial-port,arduino,C,Serial Port,Arduino,我目前正在从事一个HAB(高空气球)项目,到目前为止,一切进展顺利 我正在使用Arduino uno R3作为这个项目的主控制器,然而,我正在努力解决GPS方面的问题 遵循UK-HAS()的精彩教程,我目前正在使用uBlox MAX-6Q GPS模块 我已经使用了教程中提供的代码,并且正在使用以下草图进行测试: #include <SoftwareSerial.h> SoftwareSerial GPS(3,2); byte gps_set_success = 0; void se

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

我正在使用Arduino uno R3作为这个项目的主控制器,然而,我正在努力解决GPS方面的问题

遵循UK-HAS()的精彩教程,我目前正在使用uBlox MAX-6Q GPS模块

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

#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;
      }
    }
  }
}
后跟许多无效字符。(矩形)

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

编辑:

因此,经过更多的测试,这里的SoftwareSerial库似乎没有故障。我首先尝试使用软件串行GPS ipput写入OpenLog,然后将GPS Tx直接挂接到OpenLog Rx。同样的故事。在记事本++中打开生成的文件会产生一堆可爱的“NULL”字符。我只能假设GPS在运行时的配置方式导致了问题


绕过Arduino,关掉句子,直接通过串行工作轮询GPS,没有问题,数据返回得很完美。

所以,我觉得这里有点傻,有个问题,但GPS没有,我会单独问。看来我的软件串行库有问题


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

您确定数据不是UBX消息吗(UBX协议是二进制的,而不是NMEA1083/IEC61162)。模块可以同时使用这两种协议。也许可以用十六进制而不是ASCII输出数据,看看它是否有意义。这可能是个好主意。当我将GPS直接连接到Arduino板的UART(没有芯片)时,我可以发送“$PUBX,40,GGA,0,0,0*5A”等消息关闭句子,然后轮询模块成功返回易读信息。让我试试你的建议,然后返回给你。@Clifford因此,当读取tmp字节变量并打印为十六进制时,我得到0。看起来uBlox只是输出空数据,但我需要了解这是否是ac实际情况是,由于我的代码中有错误,或者只是在处理过程中丢失/格式错误或其他原因。您是否有示波器来监控uBlox的发送?您是在使用uBlox协议文档还是依赖示例代码?不幸的是,我只是在想示波器对我们来说有多有用现在开始…最初,我只是依靠示例代码,希望它会很好且简单。通过查看模块/协议的文档,代码可以轮询UBX,00消息,正如前面提到的,直接在arduino之外执行此操作很好。我将首先尝试轮询不同的UBX消息,然后轮询NMEA消息,看看是否可以隔离问题。
Polling: $PUBX,00*33