Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

Elmirus3
2017-08-22 10:29:19

А как можно вытащить строку выделенную красным начинающуюся с GPRMC для ее дальнейшего парсинга?
Screenshot_1.png

Elmirus3
2017-08-21 21:01:20

о, чотенько. А чего через жопу?

NoName
2017-08-21 19:49:49

p[9] = '\0';
но это через задницу решение )

Elmirus3
2017-08-21 18:51:21

Как убрать последние 2 символа в 4634.54557,  (запятая и семерка), чтоб получилось  4634.5455 ?

#include "string.h"


char *s = "$GPRMC,214603.000,A,4634.54557,N,03047.50473,E,0.00,0.00,040617,,,A*6E";
char *p;

void setup(void) {
Serial.begin(115200);

p = strchr(s, 'A') + 2; // тут начало от А +2 символа
p = strtok(p, "N");     // тут после , обрезает лишнее но как сделать типо -2 ?

    Serial.println(p);
   
}

void loop(void) {}
Elmirus3
2017-08-20 22:46:39

Получилось получить 03047.50473 то, что в принципе и нужно, но опять таки как убрать тут последнюю цифру?

#include "string.h"


char s[] ="$GPRMC,214603.000,A,4634.54557,N,03047.50473,E,0.00,0.00,040617,,,A*6E";
char * p;
int a = 0;

void setup(void) {
Serial.begin(115200);

p = strtok (s,",");

  for(int i=0; p != NULL; i++)
  {
      a++;
      if (a == 5) {         // тут указываю число расчлененной части S
        Serial.println(p);
      }
  
    p = strtok (NULL, ",");
  }
    
}

void loop(void) {}
qwone
2017-08-20 12:43:33

В общем для решения можно пойти тремя путями.
1- использовать указатели
2- использовать встроенные средства языка Си
3- использовать String
Ну и по мне еще лучше написать свой String под решение этой задачи. Но мне это зачем. Я же не ТС.
ПС: А памяти хватит, если прямыми руками писать код.

NoName
2017-08-20 09:31:20

нашел...
http://forum.arduino.ua/viewtopic.php?pid=20828#p20828
точно что то пробовал такое делать )
парсер простой,

Вячеслав Азаров  сколько добавляет кода такая либа? никогда даже не пробовал подключать, всегда места не хватает (

Elmirus3
2017-08-19 20:31:10
NoName пише:

Elmirus3 если забить на пробки то "to GIS" но пару разпод знак пускал.
скиньте в личку  viber / скайп я обьясню

0634259229 можно и так)

NoName
2017-08-19 19:17:16

Elmirus3 если забить на пробки то "to GIS" но пару разпод знак пускал.
скиньте в личку  viber / скайп я обьясню

Elmirus3
2017-08-19 19:13:20
NoName пише:

"Вряд ли здесь кто то захочет писать Вам парсинг (если у него готового нет)  smile ."
Я Одессе по старой памяти сделаю  )
как упоительные были ночные брожения с пивзавода  по проспекту Шевченко ))))
хотя вчера так ругался !!! когда нахренатор ( испоганили таки "товарищи" с mail.ru  maps.me  mad ) через  центр пустил вместо того что б  через Авангард рвануть. но ет не по делу )


Да без майла жостко с пробками. Я в прошлом месяце в Киеве с гуглкартами потерялся((

За либу спасибо, ее призывать так как и tinygps++?)

NoName
2017-08-19 18:56:16

"Вряд ли здесь кто то захочет писать Вам парсинг (если у него готового нет)  smile ."
Я Одессе по старой памяти сделаю  )
как упоительные были ночные брожения с пивзавода  по проспекту Шевченко ))))
хотя вчера так ругался !!! когда нахренатор ( испоганили таки "товарищи" с mail.ru  maps.me  mad ) через  центр пустил вместо того что б  через Авангард рвануть. но ет не по делу )

Elmirus3 вам нужно немного поправить библиотеку или поискать другую.

change  на быструю руку без проверки multiplier .

// static
// Parse degrees in that funny NMEA format DDMM.MMMM
void TinyGPSPlus::parseDegrees(const char *term, RawDegrees &deg)
{
  uint32_t leftOfDecimal = (uint32_t)atol(term);
  // uint16_t minutes = (uint16_t)(leftOfDecimal % 100);
  // uint32_t multiplier = 10000000UL;
  uint32_t multiplier = 100000UL;
  // uint32_t tenMillionthsOfMinutes = minutes * multiplier;
  uint32_t tenMillionthsOfMinutes = 0;

  // deg.deg = (int16_t)(leftOfDecimal / 100);
     deg.deg = leftOfDecimal;


	 while (isdigit(*term))
    ++term;

  if (*term == '.')
    while (isdigit(*++term))
    {
      multiplier /= 10;
      tenMillionthsOfMinutes += (*term - '0') * multiplier;
    }

//  deg.billionths = (5 * tenMillionthsOfMinutes + 1) / 3;
  deg.billionths = ( tenMillionthsOfMinutes );

  deg.negative = false;
}

эта либа под GNU Lesser General Public License (LGPL)   не забывайте )

NoName
2017-08-19 18:31:26

Nefreemen они сразу переводят в градусы при парсинге
DDMM.SSSS  > DD.DDDDDDDDDD

    case COMBINE(GPS_SENTENCE_GPRMC, 3): // Latitude
    case COMBINE(GPS_SENTENCE_GPGGA, 2):
      location.setLatitude(term);
      break;
    case COMBINE(GPS_SENTENCE_GPRMC, 4): // N/S
    case COMBINE(GPS_SENTENCE_GPGGA, 3):
      location.rawNewLatData.negative = term[0] == 'S';
      break;
    case COMBINE(GPS_SENTENCE_GPRMC, 5): // Longitude
    case COMBINE(GPS_SENTENCE_GPGGA, 4):
      location.setLongitude(term);
      break;

умножать  на 100 это лишнее )

Nefreemen
2017-08-19 17:52:11

Если так не подходит (в лоб smile ) поскольку лишняя цифра. Что бы не парсить (это не совсем простая задача для Вас) то используйте ту библиотеку о которой Вы упоминали, я так понял что речь идет о https://github.com/mikalhart/TinyGPSPlus.
Я мельком глянул, насколько понял то она позволяет получить (как свойство объекта ) любую величину GPS данных. Если она Вам дает не там запятую то умножьте на 100  smile .
Вряд ли здесь кто то захочет писать Вам парсинг (если у него готового нет)  smile .

NoName
2017-08-19 15:19:33

http://www.rapidtables.com/convert/number/degrees-to-degrees-minutes-seconds.htm
Example
Convert 30.263888889° angle to degrees,minutes,seconds:
d = integer(30.263888889°) = 30°
m = integer((dd - d) × 60) = 15'
s = (dd - d - m/60) × 3600 = 50"
So
30.263888889° = 30° 15' 50"

Elmirus3
2017-08-19 13:12:43

То есть приходит в монитор порта вот такая шняга и из 2й строки $GPRMC нужно оставить хотя бы выделенное красным:

Screenshot_1.png

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

Получается, левые 2 цифры, при наличии которых сервер отказывается показывать местоположение:

Screenshot_2.png




Вот кусок моего сооружения:
20170819_132735.jpg

Підвал форуму