我正在尝试使用 Arduino uno 和以下代码解析传入的 GPGGA NMEA GPS 字符串。我想做的是我只使用 GPGGA NMEA 字符串来获取纬度、经度和高度的值。在下面的代码中,我进行了某些检查以检查传入的字符串是否为 GPGGA,然后存储数组中的其他字符串可以使用 strtok 函数进一步解析,并且可以轻松找出所有 3 个 GPS 坐标。
但我无法弄清楚如何只存储 GPGGA 字符串而不是进一步的字符串。我正在使用 for 循环,但它不起作用。
我没有尝试使用任何库。我遇到过这样的某些现有代码。
我正在尝试具有以下功能 i)检查传入字符串是否为 GPGGA ii)如果是,则将以下字符串存储到 EOL 或最多 *(后跟数组的校验和)在数组中,数组长度是可变的(我无法找出解决方案)iii)然后解析存储的数组(完成,我用不同的数组尝试了这个)
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10,11); // 10 RX / 11 TX
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
}
void loop()
{
uint8_t x;
char gpsdata[65];
if((mySerial.available()))
{
char c = mySerial.read();
if(c == '$')
{char c1 = mySerial.read();
if(c1 == 'G')
{char c2 = mySerial.read();
if(c2 == 'P')
{char c3 = mySerial.read();
if(c3 == 'G')
{char c4 = mySerial.read();
if(c4 == 'G')
{char c5 = mySerial.read();
if(c5 == 'A')
{for(x=0;x<65;x++)
{
gpsdata[x]=mySerial.read();
while (gpsdata[x] == '\r' || gpsdata[x] == '\n')
{
break;
}
}
}
else{
Serial.println("Not a GPGGA string");
}
}
}
}
}
}
}
Serial.println(gpsdata);
}
编辑 1:考虑到 Joachim Pileborg,在代码中编辑 for 循环。
我正在添加一张图片来显示代码的未定义输出。
输入代码:
$GPGGA,092750.000,5321.6802,N,00630.3372,W,1,8,1.03,61.7,M,55.2,M,,*76
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,19,13,28,070,17,26,23,252,,04,14,186,14*79
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092750.000,A,5321.6802,N,00630.3372,W,0.02,31.66,280511,,,A*43
$GPGGA,092751.000,5321.6802,N,00630.3371,W,1,8,1.03,61.7,M,55.3,M,,*75
$GPGSA,A,3,10,07,05,02,29,04,08,13,,,,,1.72,1.03,1.38*0A
$GPGSV,3,1,11,10,63,137,17,07,61,098,15,05,59,290,20,08,54,157,30*70
$GPGSV,3,2,11,02,39,223,16,13,28,070,17,26,23,252,,04,14,186,15*77
$GPGSV,3,3,11,29,09,301,24,16,09,020,,36,,,*76
$GPRMC,092751.000,A,5321.6802,N,00630.3371,W,0.06,31.66,280511,,,A*45