Hein Pauwelyn Ответов: 3

Как разбить массив символов с помощью arduino


Я буду считывать свои GPS-координаты с моего Arduino в виде буферного массива, разделенного запятыми. данные поступают следующим образом:

$GPGGA,095350.000,5112.1239,N,04315.0058,E,1,7,1.13,0.3,M,47.2,


Вот мой код:

#include <SoftwareSerial.h>
 
SoftwareSerial SoftSerial(4, 5);
unsigned char buffer[64];
int count = 0; 

void sendGPSData() {
    if (SoftSerial.available())
    {
        while (SoftSerial.available())
        {
            char read = SoftSerial.read();

            buffer[count++] = read;

            Serial.print(String(read));

            if (count == 64) {
                break;
            }
        }

        delay(2000);
        clearBufferArray();
        count = 0;
    }
}

void clearBufferArray()
{
    for (int i = 0; i < count; i++)
    {
        buffer[i] = NULL;
    }
}


Вопрос, который у меня есть, заключается в том, как я могу разделить буферный массив, чтобы получить жирные части в выводе выше?

Что я уже пробовал:

Я пытался использовать этот код GPS-данные · GitHub[^] но есть много необходимых ресурсов.

Richard MacCutchan

Что это за язык и есть ли у него строковый токенизатор?

3 Ответов

Рейтинг:
2

DKWatson

Я использую это для своего собственного GPS-парсера. Я вытащил его из сети или из книги, но не могу вспомнить, где именно, поэтому не могу отдать должное его автору. Вам нужно объявить массив char для хранения данных GPS, которые у вас, вероятно, уже есть, а затем строковый массив, в данном случае msg_field[] с достаточным количеством элементов для каждого поля в массиве char - поле является данными между запятыми. Двадцати достаточно для GPS-данных.

byte getCSVfields()
{
    byte _sentencePos = 0;
    byte _comma_count = 0;
    msg_field[_comma_count] = "";
    while (1)
    {
        if (input_buffer[_sentencePos] == NULL) break;
        if (input_buffer[_sentencePos] == 44)
        {
            _comma_count++;
            msg_field[_comma_count] = "";
            _sentencePos++;
        }
        else
        {
            msg_field[_comma_count] += input_buffer[_sentencePos];
            _sentencePos++;
        }
    }
    return _comma_count + 1;
}


То, что вы в конечном итоге получаете, - это массив строк, в вашем случае с

$GPGGA,095350.000,5112.1239,Н 04315.0058,Е,1,7,1.13,0.3,М,47.2

msg_field[0] = $GPGGA
msg_field[1] = 095350.000
msg_field[2] = 5112.1239
msg_field[3] = N
msg_field[4] = 04315.0058
msg_field[5] = E
msg_field[6] = 1
msg_field[7] = 7
msg_field[8] = 1.13
msg_field[9] = 0.3
msg_field[10] = M
msg_field[11] = 47,2

и возвращаемое значение байта будет равно 12, количеству полей. Так что тогда вы бы поиграли с полями от 1 до 5, если я правильно вижу жирный шрифт.

Повеселиться


Рейтинг:
0

User 59241

Не изобретайте велосипед. Это предложения NMEA NMEA 0183-Википедия[^] и есть много библиотек, написанных для их разбора.

Видеть здесь: Как использовать GPS с Arduino-Parse and Log NMEA Sentences - Tutorial Australia[^]

и: NMEA:: библиотека проводов для легкого декодирования данных GPS[^]

и: TinyGPS++ | Ардуиниана[^]