Проблема с приёмом данных с GPS приёмника

Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Проблема с приёмом данных с GPS приёмника

Сообщение Sergey Ivanov »

есть отладочная плата с lm3s8962, gps приёмник ublox lea-4h-0-000.
всё соединил как надо

составил такую программу:
Безымянный.jpg
то есть принимаю данные и тут же пишу их на флешку

в итоге получаю следующий лог:
5.txt
(69.18 КБ) 212 скачиваний
в логе есть мета, где данные идут "безразрывно", т.е. я считаю, что правильно:

Код: Выделить всё

$GPRMC,190310.50,A,5951.1.27805,N,03020.90420,E,1,04,4.80,70.8,M,18.0,M,,*63
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.65,4.80,4.60*07
$GPRMC,190311.00,A,5951.27805,N,03020.90420,E,0.1,04,4.80,70.8,M,18.0,M,,*67
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.66,4.80,4.61*05
$GPRMC,190311.50,A,5951.1.27805,N,03020.90420,E,1,04,4.80,70.8,M,18.0,M,,*62
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.65,4.80,4.61*06
$GPRMC,190312.00,A,5951.27805,N,03020.90420,E,0.1,04,4.80,70.8,M,18.0,M,,*64
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.65,4.80,4.61*06
$GPRMC,190312.502.50,5951.27804,N,03020.90422,E,1,04,1.21,70.8,M,18.0,M,,*6C
$GPGSA,A,3,26,28,05,27,,,,,,,,,1.51,1.21,0.90*02
$GPRMC,190313.00,A,5951.27814,N,03020.90448,E,0.1,04,4.80,70.5,M,18.0,M,,*66
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.66,4.80,4.61*05
$GPRMC,190313.50,A,5951.27814,N,N,03020.90448,E,1,04,4.80,70.5,M,18.0,M,,*63
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.66,4.80,4.61*05
$GPRMC,190314.00,A,5951.27814,N,03020.90448,E,0.1,04,4.80,70.5,M,18.0,M,,*61
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.66,4.80,4.61*05
$GPRMC,190314.50,A,5951.1.27814,N,03020.90448,E,1,04,4.80,70.5,M,18.0,M,,*64
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.66,4.80,4.61*05
$GPRMC,190315.00,A,5951.27814,N,N,03020.90448,E,1,04,4.81,70.5,M,18.0,M,,*61
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.66,4.81,4.61*04
$GPRMC,190315.50,A,5951.27814,N,03020.90448,E,0.1,04,4.80,70.5,M,18.0,M,,*65
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.66,4.80,4.61*05
$GPRMC,190316.00,A,5951.27814,N,03020.9090448,E,1,04,4.80,70.5,M,18.0,M,,*63
$GPGSA,A,3,26,28,05,27,,,,,,,,,6.66,4.80,4.61*05
и места, где строки принимаются в непонстном виде, толи искажённые, то ли урезанные, то ли с переносами на новую строку непонятные, в общем, вид непонятный:

Код: Выделить всё

$GPRMC,190336.00,A,5951.27814,N,N,03020.90448,E,1,05,3.63,70.5,M,18.0,M,,*6A
$GPGSA,A,3,26,28,15,05,27,,,,,,,,5.33,3.63,3.90*01
72
$GPGGA,190336.50,5951.27814,N,03020.27,,,,,,,3.63,2.09,2.97*01
75
$GPGGA,19033PGSA,A,3,26,28,08,15,05,27,,,,,,,1.36,1.03,0.89*07
7D
$GPGGA,190337.50,5951.27820,N,03020.9045,,,,,3.63,2.09,2.97*01
72
$GPGGA,190338.00,5951.27820,8,15,05,27,,,,,,,3.64,2.09,2.98*09
77
$GPG,*65
$GPGSA,A,3,26,28,08,15,05,27,,,,,,,3.64,2.09,2.98*09
73
$GPGGA,190339.00,5951.27820,N,03020.27,,,,,,,3.64,2.09,2.98*09
76
$GPG,*64
$GPGSA,A,3,26,28,08,15,05,27,,,,,,,3.63,2.09,2.97*01
7D

Код: Выделить всё

$GPRMC,190531.50,A,5951.27924,N,03020.89900,E,0.000,,2903,72.3,M,18.0,M,,*60
$GPGSA,A,3,26,28,15,05,27,,,,,,,,5.50,3.73,4.05*0E
,18.0,M,,*66
$GPGSA,A,3,26,28,15,05,27,,,,,,,,5.50,3.73,4.04*0F
$GPRMC,190532.50,A,5951.27924,N,03020.8989900,E,1,05,3.73,72.3,M,18.0,M,,*63
$GPGSA,A,3,26,28,15,05,27,,,,,,,,5.50,3.73,4.04*0F
,18.0,M,,*67
$GPGSA,A,3,26,28,15,05,27,,,,,,,,5.50,3.73,4.04*0F
7A
$GPG,*62
$GPGSA,A,3,26,28,15,05,27,,,,,,,,5.50,3.73,4.04*0F
78
$GPGGA,19053PGSA,A,3,26,28,15,05,27,,,,,,,,5.50,3.73,4.04*0F
7D
$GPGGA,19053PGSA,A,3,26,28,15,05,27,,,,,,,,5.50,3.73,4.04*0F
79
$GPGGA,190535.00,595,26,28,15,05,27,,,,,,,,5.50,3.73,4.04*0F
7C
$GPGGA,19053PGSA,A,3,26,28,15,05,27,,,,,,,,5.50,3.73,4.04*0F
7A
$GPGGA,19053PGSA,A,3,26,28,15,05,27,,,,,,,,5.50,3.73,4.04*0F
$GPRMC,190536.50,A,5951.27924,N,03020.8989904,E,1,05,1.13,72.3,M,18.0,M,,*67
$GPGSA,A,3,26,28,15,05,27,,,,,,,,1.44,1.13,0.90*03
7E

может, кто-нибудь знает в чём может крыться проблема ?

пробовал ставить задержку вплость до 1000 мс - не помогло. пробовали напрямую к компу подключать приёмник - всё отлично работает, пробовал использовать внешнее (не от отладочной платы питание) - тоже не помогло.
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Eugen Graf »

Перепроветь, настройки порта - таймаут, терминацию и заодно задержку в цикле.
Аватара пользователя
Cat
adviser
adviser
Сообщения: 203
Зарегистрирован: 22 июл 2010, 09:53
Версия LabVIEW: 12
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Cat »

у меня с шумомером по 232 похожая проблема была,периодически контакт пропадал на разъеме, и в буфер попадали не полные строки. эффект был схожий. может не в тему, а может поможет
Чеширский Кот - совсем не тот, что чешет языком.
Аватара пользователя
Konstantin Sumenko

Activity Bronze
expert
expert
Сообщения: 1439
Зарегистрирован: 17 июл 2008, 12:20
Награды: 2
Версия LabVIEW: 2010
Откуда: Moscow
Поблагодарили: 1 раз
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Konstantin Sumenko »

Первое: проверить baudrate.
Второе: убери все задержки- вместо этого накапливай в буфере порта определенное кол-во байт и по превышении (только планку возьми меньше чем размер всего буфера)- читай их все из порта через Serial Read и пиши в файл (и еще: не пиши в файл слишком часто).
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Sergey Ivanov »

спасибо за ответы !
Перепроветь, настройки порта - таймаут, терминацию и заодно задержку в цикле.
таймаут стоит 10000 мс, терминация - это что ? у меня сейчас аздержка 20мс, пробовал менять значения - всё тоже самое.
у меня с шумомером по 232 похожая проблема была,периодически контакт пропадал на разъеме, и в буфер попадали не полные строки. эффект был схожий. может не в тему, а может поможет
тоже об этом думал, перепроверил контакты - всё нормально
Первое: проверить baudrate.
Второе: убери все задержки- вместо этого накапливай в буфере порта определенное кол-во байт и по превышении (только планку возьми меньше чем размер всего буфера)- читай их все из порта через Serial Read и пиши в файл (и еще: не пиши в файл слишком часто).
ок, попробую. спасибо
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Sergey Ivanov »

Первое: проверить baudrate.
Второе: убери все задержки- вместо этого накапливай в буфере порта определенное кол-во байт и по превышении (только планку возьми меньше чем размер всего буфера)- читай их все из порта через Serial Read и пиши в файл (и еще: не пиши в файл слишком часто).
baudrate - правильный. ради интереса пробовал ставить больше или меньше - крокозябки получались.

потом обратил внимание на длину принимаемого сообщения - она оказалась разной (от 0 до 45, примерно). хотя, по идее, должна быть одинаковой. ( для случая, пока ещё спутников не нашёл)
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Проблема с приёмом данных с GPS приёмника

Сообщение IvanLis »

Sergey Ivanov писал(а):baudrate - правильный. ради интереса пробовал ставить больше или меньше - крокозябки получались.

потом обратил внимание на длину принимаемого сообщения - она оказалась разной (от 0 до 45, примерно). хотя, по идее, должна быть одинаковой. ( для случая, пока ещё спутников не нашёл)
Сейчас занимаюсь примерно тем же, только скрещиваю Seeeduino Stalker v2.1 и GPS Bee.

1. если неверно установить скорость или структуру пакета, то сразу будет заметно, пойдут козебоберы :wink:
2. длина пакетов разная, единственно ограничение NMEA не больше 80 символов, ну и соответственно разумный минимум

У меня аналогичная проблема, данные идут кусками.
Я хоть и оптимизировал код, но видимо все равно не успевает одновременно считывать и сохранять (у меня пишется на SD). Контроллер работает на частоте 8MHz.
Сейчас работаю над оптимизацией кода :crazy: .

Вот подспорье: NMEA Parse Library

Будут результаты сообщу.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Eugen Graf »

Ещё раз намекаю - дело в считывании. Проверить нужно терминацию и считывать построчно, а не столько символов, сколько есть в порте.
А что кстати с Set File Position? Оно не нужно здесь разве?
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Eugen Graf »

Вот накидал на скорую руку и проверил, всё работает.
Вложения
GPS_Logger.png
GPS.txt
(4.02 КБ) 179 скачиваний
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Sergey Ivanov »

спасибо, попробую !
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Sergey Ivanov »

разобрался с проблемой. оказывается, если просто задать какое-то количество байт для чтения, то ничего не читается и ничего не работает. заметил, если сначала задать на чтение 0 байт и увеличивать, хоть скачком, то уже начинает нормально работать. сделал программу такую:
Безымянный.jpg
на экране отображается следующее:
IMAG0633.jpg
в логе пишеться так (единственное что лог писал в другое время и спутников приёмник так и не поймал, почему-то):
1.rar
(4.49 КБ) 180 скачиваний
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
Konstantin Sumenko

Activity Bronze
expert
expert
Сообщения: 1439
Зарегистрирован: 17 июл 2008, 12:20
Награды: 2
Версия LabVIEW: 2010
Откуда: Moscow
Поблагодарили: 1 раз
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Konstantin Sumenko »

Слушай, а сколько стека твоя прога ест?
Аватара пользователя
Sergey Ivanov

Activity Professionalism Gold Автор
expert
expert
Сообщения: 1217
Зарегистрирован: 01 мар 2009, 20:54
Награды: 5
Версия LabVIEW: 2018
Откуда: Санкт-Петербург, Кронштадт
Благодарил (а): 11 раз
Поблагодарили: 1 раз
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Sergey Ivanov »

что такое стек ? и где можно посмотреть ?
Добро пожаловать на http://rk-stud.ru/
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5462
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 86 раз

Re: Проблема с приёмом данных с GPS приёмника

Сообщение IvanLis »

IvanLis писал(а):Сейчас занимаюсь примерно тем же, только скрещиваю Seeeduino Stalker v2.1 и GPS Bee.
... но видимо все равно не успевает одновременно считывать и сохранять
Проблема оказалось видимо именно в этом.

Сначала опишу ситуацию, потом ее решение...
GPS приемник передает данные согласно протокола NMEA через UART интерфейс.
Контроллер ATmega328 их принимает, разбирает и сохраняет на SD подключенную к SPI шине.

Алгоритм
Данные от GPS идут со скоростью 9600, считываются побайтово. При этом проверяется байт, если он равен 13 (\r), то байт пропускается. Если 10 (\n), то строка принята полностью и передается на обработку.
Затем проверяется, что это GPRMC сообщение. И если оно таковое, то разбирается на составляющие по знаку запятой.

Формируется строка LogString на основании:
1- 225446 Time of fix 22:54:46 UTC
3- 4916.45
4- N Latitude 49 deg. 16.45 min North
5- 12311.12
6- W Longitude 123 deg. 11.12 min West
9- 191194 Date of fix 19 November 1994

И если данные в норме (2- A Navigation receiver warning A = OK, V = warning), открываем файл на чтение и если все ОК, то пишем строку в файл.

Так как пакеты RMC идут с перерывами, то в промежутках между ними данные анализируются и сохраняются успешно.

Пример
Привожу пример написанный на С.
Это не аксиома, но стабильно работающий, тестовый вариант, по крайней мере на моем оборудовании.

Код: Выделить всё

#include <SD.h>

#define INTERMINATOR 10 // 10 = \n LF
#define INLENGTH 80 // 80

char inString[INLENGTH];
char inChar;

int inCount;
int i;
int SubData;

bool ValidData=false;
bool LED = true;

File myFile;
char* FileName="logfile.txt";

/*

 $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
 $GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68
 
 0-           GPRMC
 1-           225446       Time of fix 22:54:46 UTC
 2-           A            Navigation receiver warning A = OK, V = warning
 3-           4916.45
 4-           N    Latitude 49 deg. 16.45 min North
 5-           12311.12
 6-           W   Longitude 123 deg. 11.12 min West
 7-           000.5        Speed over ground, Knots
 8-           054.7        Course Made Good, True
 9-           191194       Date of fix  19 November 1994
 10-          020.3
 11-          E      Magnetic variation 20.3 deg East
 12-          *68          mandatory checksum
 */

String GPGString;
String SubString;
String LogString;


void setup() {
  // initialize the digital pin as an output.
  // Pin 8 has an LED connected on most SeeDuino Stalker boards:
  pinMode(8, OUTPUT);
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
  pinMode(10, OUTPUT);

  SD.begin(10);

  // Start the serial interface
  Serial.begin(9600);
}

void loop() {

  inCount = 0;
  inString[inCount]=0;

  do {
    while (Serial.available() == 0);

    inChar = Serial.read();
    if ((inChar!=10) and (inChar!=13)){
      inString[inCount] = inChar;
      ++inCount;
    }
    if (inChar == INTERMINATOR) break;
  } 
  while (inCount < INLENGTH);

  GPGString=inString;
  SubString="";
  LogString="";

  if (GPGString.substring(0,6) == "$GPRMC") {
    //    Serial.println("$GPRMC Data");
    SubData=0;
    for (i=0; i<GPGString.length(); i++){

      if (GPGString[i]!=44){ // 44 = ","
        SubString = SubString + GPGString[i];
        //    Serial.println(SubString);
      }

      else {
        switch (SubData) {

        case 1:
          SubData=2;
          LogString=SubString;
          break;

        case 2:
          SubData=3;
          ValidData=false;
          if (SubString=="A"){
            ValidData=true;
          }
          break;

        case 3:
          SubData=4;
          LogString = LogString + "," + SubString;
          break;

        case 4:
          SubData=5;
          LogString = LogString + "," + SubString;
          break;

        case 5:
          SubData=6;
          LogString = LogString + "," + SubString;
          break;

        case 6:
          SubData=7;
          LogString = LogString + "," + SubString;
          break;

        case 9:
          SubData=10;
          LogString = SubString + "," + LogString;
          break;

        default:
          ++SubData;
        }

        SubString="";

      }
    }
  }

  if (ValidData){
    // open file
    myFile = SD.open(FileName, FILE_WRITE);
    // if the file is available, write to it:
    if (myFile) {
      // print to the file GPS Data
     
      digitalWrite(8, LED);
      LED = !(LED);
      
      myFile.println(LogString);
    }
    myFile.close();
  }
}
Проблема еще в том, что порт UART всего один, а программно эмулировать ресурсоемко. То контролировать через RS-Terminal не будем, а для наглядности при каждой успешной записи данных в лог-файл мигает диод (инвертируется уровень). К тому-же, как только диод начал моргать, значит спутники пойманы и данные пошли.
Аватара пользователя
Oleg B.

Activity Professionalism
leader
leader
Сообщения: 674
Зарегистрирован: 25 сен 2011, 11:30
Награды: 2
Версия LabVIEW: 5 .. 2021
Откуда: Israel
Контактная информация:

Re: Проблема с приёмом данных с GPS приёмника

Сообщение Oleg B. »

При этом проверяется бит, если он равен 13 (\r), то бит пропускается. Если 10 (\n), то строка принята полностью и передается на обработку.
Бит не может быть 2..255 и т.д. Байт может - в нём все-таки 8 бит.
В протоколе NMEA вообще не должно быть байта со значением ( 13 = x0D = "\r")
veni, vidi, phallomorphi
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Real Time / FPGA / Embedded»