我目前正在做一个HAB (高空气球)项目,到目前为止,一切都进展顺利。
我正在使用一个Arduino uno R3作为我的主要控制器,然而,我在这里的东西的全球定位系统方面的斗争。
关于英国的奇妙教程-有(http://ukhas.org.uk/guides:ublox6),我目前正在与uBlox最大-6Q全球定位系统模块工作。
我已经使用了教程中提供的代码,并且正在用下面的草图进行测试:
#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语句,并对模块进行轮询,但是在投票时,我会受到以下的欢迎:
Polling: $PUBX,00*33后面跟着一些无效的字符。(矩形)
我已经检查了波特率、停止位、奇偶校验等,以及实际的数据线连接,但似乎找不到这方面的来源。它给我暗示了糟糕的数据线/编码/对我来说,但我想知道这是否是其他人曾经经历过的事情?
编辑:
因此,经过更多的测试后,似乎SoftwareSerial库在这里并没有错。我首先尝试使用OpenLog GPS ipput编写SoftwareSerial,然后将SoftwareSerial Tx直接连接到OpenLog Rx。同样的故事。在Notepad++中打开结果文件将产生一堆可爱的'NULL‘字符。我只能假设在运行时配置GPS的方式会导致问题。
绕过Arduino,关闭句子,直接通过串行工作轮询GPS,没有任何问题,数据被完美地返回。
发布于 2013-10-21 19:49:23
所以,我觉得有点傻,有一个问题,但不是全球定位系统,我会问一个单独的问题。看来我在SoftwareSerial库上遇到了问题。
SoftwareSerial库不能同时使用多个软串行端口,似乎尽管有许多其他建议,但我不能在sof串行端口之间切换,因为我无法开始()第二个端口,似乎第一个声明的端口是不可用的。
https://stackoverflow.com/questions/19478075
复制相似问题