Разбор нескольких данных NMEA0183 - PullRequest
0 голосов
/ 08 декабря 2018

Я создаю проект IoT, в котором Arduino Uno соединяется с сонаром Lowrance с помощью NMEA0183 и Spackfun's Weather Shield .Поскольку это IoT, мне нужно выгрузить все данные в базу данных и проанализировать данные NMEA0183 для хранения.

Мне нужно использовать данные GPS, которые я выбрал, чтобы использовать формат GLL и данные сонара, которые представляют собой глубину DPT и температуру жидкости MTW.Я уже завершил синтаксический анализ без использования какой-либо библиотеки, так как нет библиотеки для анализа данных сонара.Код написан ниже.

  while(Serial.available() > 0){ 
    NMEAsentence[i] = Serial.read();
    //Serial.print(NMEAsentence[i]);

   if(NMEAsentence[i] == 0x0a){
   //Serial.print(NMEAsentence[1]);
     if(NMEAsentence[0] == '$' && NMEAsentence[1] == 'S' && NMEAsentence[2] == 'D' && NMEAsentence[3] == 'M' && NMEAsentence[4] == 'T' && NMEAsentence[5] == 'W'){
       w_temp = atof(TEST=strtok(&NMEAsentence[6], ","));
       Serial.println(w_temp);    
     }
     if(NMEAsentence[0] == '$' && NMEAsentence[1] == 'G' && NMEAsentence[2] == 'P' && NMEAsentence[3] == 'G' && NMEAsentence[4] == 'L' && NMEAsentence[5] == 'L'){
       latitude = atof(TEST=strtok(&NMEAsentence[6], ","));
       while(TEST != NULL){
         TEST = strtok(NULL,",");
         if(TEST != NULL){
           switch (count){
             case 0:
               dirNS = *TEST;
               count++;
               break;
             case 1:
               longitude = atof(TEST);
               count++;
               break;
            case 2:
               dirWE = *TEST;
               count++;
               break;
            default:
               break;
            }
          //Serial.println(TEST);
          Serial.println(latitude);
          Serial.println(dirNS);
          Serial.println(longitude);
          Serial.println(dirWE);
         }
       }
     }//gll parsing loop if
   i = 0;
  }else i++;
}   

Код работает нормально, когда я тестирую его отдельно с помощью эхолота Lowrance.Проблема заключается в том, что я комбинирую данные из поиска рыбы и Weather Shield Sparkfun с измерением 10 минут (предположительно) за 1 раз измерения.

В соответствии с примером Weather Shield от Sparkfun здесь ,автор использовал код

if (millis() - lastSecond >= PERIOD_WAIT_TIME){
  lastSecond += PERIOD_WAIT_TIME;
}

для создания интервала измерения.Я вставляю свой код разбора NMEA в этот цикл (код ниже), и результат не тот, который я хочу.

if (millis() - lastSecond >= PERIOD_WAIT_TIME){
  lastSecond += PERIOD_WAIT_TIME;

  //NMEA parsing here

  //get data from weather shield
  Temp = PressureSensor.readTemp();
  Serial.print(" Temp = ");
  Serial.print(Temp, 2);
  Serial.print("C, ");

  //upload data to IoT Platform
  if(sakuraio.enqueueTx(0,Temp) != CMD_ERROR_NONE){
   Serial.println("[ERR] enqueue error");
 }
 sakuraio.send();
}

Оператор NMEA читается и анализируется, но только одно предложение за один раунд измерения.Например, у меня есть как GLL, так и MTW для анализа, но когда я запускаю программу, анализируется только MTW или GLL (другой игнорируется), и мне нужно подождать еще 10 минут.Будет ли анализ MTW или GLL казаться случайным.

Мне нужно проанализировать оба во время измерения, у вас есть какие-либо предложения для этого?Кроме того, я думаю о загрузке обоих операторов NMEA в виде строк и их последующем синтаксическом анализе с помощью сценария PHP или JS, прежде чем они попадут в базу данных?Это будет действительным?

...