我目前正在开展一个HAB(高海拔气球)项目,到目前为止,所有项目都已经过去了。
我正在使用Arduino uno R3作为此项目的主控制器,但是,我正在努力解决GPS方面的问题。
在UK-HAS(http://ukhas.org.uk/guides:ublox6)掌握精彩教程我目前正在使用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;
}
}
}
}
我一直在努力解决2个问题。我在getUBX_ACK方法中达到了超时,因此意味着GPS模块没有响应来确认设置更改。这当前不是必需的,如果需要,我可以通过uCenter配置它,并添加电池以保留设置。
然而,我面临的主要问题是当我在设置注释时使用setNav块运行此草图时,我能够关闭所有自动NMEA句子,并轮询模块,但在轮询时,我是迎接以下内容:
Polling: $PUBX,00*33
后跟一些无效字符。 (矩形)
我已经检查了波特率停止位,奇偶校验等以及实际的数据线连接,但似乎无法找到它的来源。它建议不好的数据线/编码/给我,但我想知道这是否是其他任何人曾经历过的事情?
编辑:
因此,经过更多测试后,似乎SoftwareSerial库在这里没有错。我首先尝试使用SoftwareSerial GPS ipput写入OpenLog,然后将GPS Tx直接挂接到OpenLog Rx。相同的故事。在Notepad ++中打开生成的文件会产生一堆可爱的“NULL”字符。我只能假设在运行时配置GPS的方式导致问题。
绕过Arduino,关闭句子并通过串行工作直接轮询GPS没有任何问题,数据返回完美。
答案 0 :(得分:0)
所以,我觉得这里有点愚蠢,有一个问题,但没有GPS,我会问一个单独的问题。看起来我遇到了SoftwareSerial库的问题。
SoftwareSerial库不能同时使用多个软串口,看来尽管有很多建议,但我无法在sof串口之间切换,因为我无法启动()第二个端口,看来首先声明的端口是无法使用的。