сборка строк из сериала

teodor4ik
Offline
Зарегистрирован: 04.11.2013

вопрос конечно глупейший, но усьо же.

Из буфера сериала приходят данные. Ждать прихода всей строки некогда. Задача списать буфер в некую временную переменную и дописывать в строку вплоть до прихода #10#13. Далее вывести кусок на экран. Очистить, дописать что осталось из прошлой порции и т.д.

Знаю что где-то это уже не раз наверняка обсуждалость, но найти слету не смог.

Конкретно имеется в виду вывод на экран координат с ЖПСа, но без тинижпс библиотек и т.п.

Пока код такой:

#include <LCD4Bit_mod.h>
LCD4Bit_mod lcd = LCD4Bit_mod(2);

char data;
static char str_buffer[25];

prog_char GPSstr_poll[] PROGMEM = "$PUBX,00*33";
prog_char GPSstr_setup1[] PROGMEM = "$PUBX,40,ZDA,0,0,0,0*44";
prog_char GPSstr_setup2[] PROGMEM = "$PUBX,40,GLL,0,0,0,0*5C";
prog_char GPSstr_setup3[] PROGMEM = "$PUBX,40,VTG,0,0,0,0*5E";
prog_char GPSstr_setup4[] PROGMEM = "$PUBX,40,GSV,0,0,0,0*59";
prog_char GPSstr_setup5[] PROGMEM = "$PUBX,40,GSA,0,0,0,0*4E";
prog_char GPSstr_setup6[] PROGMEM = "$PUBX,40,GGA,0,0,0,0*5A";
prog_char GPSstr_setup7[] PROGMEM = "$PUBX,40,RMC,0,0,0,0*47";

PROGMEM const char *str_table[] = {
  GPSstr_poll, GPSstr_setup1, GPSstr_setup2, GPSstr_setup3,
  GPSstr_setup4, GPSstr_setup5, GPSstr_setup6, GPSstr_setup7};


void setup()

{

  Serial.begin(9600);
  Serial3.begin(9600);
  lcd.init();
  lcd.clear();
  Serial3.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table[1])));
  Serial3.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table[2])));
  Serial3.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table[3])));
  Serial3.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table[4])));
  Serial3.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table[5])));
  Serial3.println(strcpy_P(str_buffer, (char*)pgm_read_word(&str_table[6])));
}

void loop()

{

  if(Serial3.available() > 0) {
  data = Serial3.read();

  Serial.print(data);
  lcd.print(data);
}

}

Лепит на экран чопопало, но не то что надо.

 

toc
Offline
Зарегистрирован: 09.02.2013

1. чо на экран лепит?

2. чо куда подключено?

3. чо вы хотите от всего этого?

4. предлагаю сначала отключить жпс, убрать лишнее из программы, вывесте на lcd слово hello

5. потом отключить lcd, подключить жпс, убрать лишнее из программы, вывести строку в сериал монитор.

чирс.

com
Offline
Зарегистрирован: 06.09.2013

а что выводится в мониторе порта?

teodor4ik
Offline
Зарегистрирован: 04.11.2013

а что выводится в мониторе порта?

монитор порта выводит как положено:

$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53
$GPRMC,,V,,,,,,,,,,N*53

Тоесть спутников не видит. Но по приходу 1013 строку переводит как положено.

1. чо на экран лепит

На экран же, на воздухе (без сериала, т.к. ноута нету) выводится каша. Потому как вываливает ее порциями по ходу получения переписывая, то что уже было на экране. обновляясь несколько раз в секунду.

$GPRMC,125504.04 |  9,A,5542.23894,N  |  ,03741.60636,E,0  |  .06,25.82,200906  |  ,99.99,99.99,*17

2. чо куда подключено?

мега2560 с LCD keypad шилдом (16*2 + кнопки), Neo 6m на сериал3, Nrf24l01 на 48,49,50-52 (пока не участвует, но потом должен отправлять данные с гпса)

3. чо вы хотите от всего этого?

строки на экране:

N - 5542.23894  |  E - 3741.60636

и значения курса - скорости - времени в переменных. Тоесть собрать строку:

$GPRMC,125504.049,A,5542.2389,N,03741.6063,E,0.06,25.82,200906,,,*17

и дальше уже ее разобрать на запчасти(это вроде уже есть в манах).

4. предлагаю сначала отключить жпс, убрать лишнее из программы, вывесте на lcd слово hello

это даже не смешно :)

5. потом отключить lcd, подключить жпс, убрать лишнее из программы, вывести строку в сериал монитор.

С этого и начинал, но спутников не видит возле компа.

com
Offline
Зарегистрирован: 06.09.2013

честное слово, я три раза перечитал все, что вы написали, но с каждым разом все меньше и меньше становилось понятно, чего именно у вас не работает. то у вас данные с gps-шилда льются, но косяк с передачей их на экран (каша), то не льются, поэтому монитор порта спутников не видит.

а?

toc
Offline
Зарегистрирован: 09.02.2013

teodor4ik пишет:

На экран же выводится каша. Потому как вываливает ее порциями по ходу получения переписывая, то что уже было на экране. обновляясь несколько раз в секунду.

добавьте в начало loop:

delay(1000);
lcd.clear();

 

teodor4ik
Offline
Зарегистрирован: 04.11.2013

toc пишет:

добавьте в начало loop:

delay(1000);
lcd.clear();

не то... пробовал, просто порции больше и обновляется реже. Суть вопроса не решает.

toc пишет:

честное слово, я три раза перечитал все, что вы написали, но с каждым разом все меньше и меньше становилось понятно, чего именно у вас не работает. то у вас данные с gps-шилда льются, но косяк с передачей их на экран (каша), то не льются, поэтому монитор порта спутников не видит.

а?

именно так... в коде же видно что данные уходят и в сериал и на экран. Там где есть комп(сериал), нету спутников(в глубине здания, и это вполне понятно) и наоборот, я это писал чтобы объянить странный вид получаемых в сериал НМЕА строк и то что в сериал я их не могу поиметь в нормальном виде.

Косяков с передачей на экран нету. Все льется, как положено в кривом коде - кусками по приходу в буфер сериал3(жпс), переписывая поочередно куски экрана... но не так как хотелось бы.

Теперь повторю чего хотелось бы (просто я в с++ синтаксисе откровенно не силен).

Куски которые приходят из буфера добавлять к некой переменной (чар например).

По факту получения символов конца строки скопировать эту строку(до знака конца строки) в другую переменную. поставить маркер "готово"-тру.

из первой переменной отрезать лишнее и оставить только то что принадлежит новой строке и далее набивать ее из буфера...

loop

если стоит маркер "готово" {

проверить ее на соответствие CRC и разобрать строку на куски по кучке переменных.

сбросить маркер

вывести нужное на экран в нужном месте}

teodor4ik
Offline
Зарегистрирован: 04.11.2013
#include <Console.h>

String name;

void setup() {
  // Initialize Console and wait for port to open:
  Bridge.begin();
  Console.begin(); 

  // Wait for Console port to connect
  while (!Console); 

  Console.println("Hi, what's your name?");
} 

void loop() {
  if (Console.available() > 0) {
    char c = Console.read(); // read the next char received
    // look for the newline character, this is the last character in the string
    if (c == '\n') {
      //print text with the name received
      Console.print("Hi ");
      Console.print(name);
      Console.println("! Nice to meet you!");
      Console.println();
      // Ask again for name and clear the old name
      Console.println("Hi, what's your name?");
      name = "";  // clear the name string
    } 
    else {       // if the buffer is empty Cosole.read() returns -1
      name += c; // append the read char from Console to the name string
    }
  }
}

вот приблизительно то, о чем я вел речь, но мне кажется, что это будет работать только если в буфере 1 символ... а если больше? Или в данном случае чар безразмерный? Опять же проверка конца строки, а если в буфере не только "/n", а "блабла/n" И отдельно о объявлении стринга "name" - это в пределах допустимого?

string - текстовые строки

Текстовые строки в Ардуино объявляются как массив (array) типа char (символов - литер), оканчивающийся символом "конца строки".

 

teodor4ik
Offline
Зарегистрирован: 04.11.2013

Все вопросы снимаются...  http://arduino.cc/en/Tutorial/HomePage п.8 есть все что надо.

Я неправильно интерпретировал данные о том что "стринг это массив чаров с /n в конце" как: "в ардуино вместо стринга принято пользовать чары с /n в конце", копипаста выше. Нада ж так утупить... ессно с чарами то же провернуть сложнее и главное ни один поиск не поможет.