gpt4 book ai didi

c - GPS NMEA 字符串的解析代码

转载 作者:太空狗 更新时间:2023-10-29 15:35:57 26 4
gpt4 key购买 nike

enter image description here我正在尝试使用 Arduino uno 和以下代码解析传入的 GPGGA NMEA GPS 字符串。我想做的是我只使用 GPGGA NMEA 字符串来获取纬度、经度和高度的值。在我下面的代码中,我进行了某些检查以检查传入字符串是否为 GPGGA,然后存储数组中的其他字符串可以使用 strtok 函数进一步解析,并且可以轻松找出所有 3 个 GPS 坐标。

但我无法弄清楚如何只存储 GPGGA 字符串而不存储其他字符串。我正在使用 for 循环,但它不起作用。

我没有尝试使用任何库。我遇到了某些 existing codes like this.

Here is the GPGGA string information link

我正在尝试具有以下功能i) 检查传入字符串是否为 GPGGAii)如果是,则将以下字符串存储到 EOL 或 upto *(后面是数组的校验和)在数组中,数组长度是可变的(我无法找到解决方案)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

最佳答案

快速查看有关 NMEA 0183 协议(protocol)的链接文章后,我突然想到:

<CR><LF> ends the message.

这意味着,您应该寻找那个序列,而不是随便从串行端口读取。如果找到,则应终止字符串并跳出循环。

此外,您可能希望首先对数据字符串进行零初始化,以便轻松查看其中是否确实有任何数据要打印(例如使用 strlen )。

关于c - GPS NMEA 字符串的解析代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19868156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com