Я пытаюсь разобрать входящую строку GPGGA NMEA GPS, используя Arduino uno и ниже кода. Что я пытаюсь сделать, так это то, что я использую только строку GPGGA NMEA для получения значений широты, долготы и высоты. В моем нижнем коде я установил определенные проверки, чтобы проверить, является ли входящая строка GPGGA или нет, а затем сохраните дальнейшая строка в массиве, которая может быть дополнительно проанализирована с использованием функции strtok, и все 3 GPS-координаты могут быть легко обнаружены.Анализ кода GPS NMEA string
Но я не могу понять, как хранить только строку GPGGA, а не следующую строку. Я использую цикл for, но он не работает.
Я не пытаюсь использовать любой library.I уже наткнулся на определенный existing codes like this.
Here is the GPGGA string information link
я пытаюсь иметь следующие functionlity я) Проверьте, если входящий строка GPGGA б) Если да, то затем сохраните следующую строку до 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: Рассмотрение Иоахима Пилеборга, редактирование цикла for в коде.
Я добавляю pic, чтобы показать undefined вывод кода.
Вход для кода:
$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
У вас есть ошибка «один за другим». Во внутреннем цикле 'for' вы повторяете от 0 до 65 и 66 записей для массива, содержащего 65 записей. Это приводит к неопределенному поведению. –
Кроме того, в зависимости от данных и функции 'Serial.println', если функция' Serial.println' ожидает строку (т. Е. Данные заканчиваются нулем), а 'gpsdata' не заканчивается нулем, тогда вы снова имеют неопределенное поведение. Кроме того, если 'gpsdata' не является текстовым, а двоичным, то он может содержать внедренный нуль, который рассматривается как ограничитель строки. И поскольку 'gpsdata' является локальной переменной, это * не * заполняется нулями (все его значения неопределены, пока вы не инициализируете его), используя его в случае ошибок, также является неопределенным поведением. –
Используйте возвращаемое значение из 'mySerial.available()', чтобы получить количество байтов в трубе для чтения, выделить память для массива строк, прочитать его и проверить на достоверность. См. Подробности в ответе ниже. – ryyker