сборка строк из сериала
- Войдите на сайт для отправки комментариев
Чт, 07/11/2013 - 18:23
вопрос конечно глупейший, но усьо же.
Из буфера сериала приходят данные. Ждать прихода всей строки некогда. Задача списать буфер в некую временную переменную и дописывать в строку вплоть до прихода #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); } }
Лепит на экран чопопало, но не то что надо.
1. чо на экран лепит?
2. чо куда подключено?
3. чо вы хотите от всего этого?
4. предлагаю сначала отключить жпс, убрать лишнее из программы, вывесте на lcd слово hello
5. потом отключить lcd, подключить жпс, убрать лишнее из программы, вывести строку в сериал монитор.
чирс.
а что выводится в мониторе порта?
а что выводится в мониторе порта?
монитор порта выводит как положено:
$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, подключить жпс, убрать лишнее из программы, вывести строку в сериал монитор.
С этого и начинал, но спутников не видит возле компа.
честное слово, я три раза перечитал все, что вы написали, но с каждым разом все меньше и меньше становилось понятно, чего именно у вас не работает. то у вас данные с gps-шилда льются, но косяк с передачей их на экран (каша), то не льются, поэтому монитор порта спутников не видит.
а?
На экран же выводится каша. Потому как вываливает ее порциями по ходу получения переписывая, то что уже было на экране. обновляясь несколько раз в секунду.
добавьте в начало loop:
delay(1000);
lcd.clear();
добавьте в начало loop:
delay(1000);
lcd.clear();
не то... пробовал, просто порции больше и обновляется реже. Суть вопроса не решает.
честное слово, я три раза перечитал все, что вы написали, но с каждым разом все меньше и меньше становилось понятно, чего именно у вас не работает. то у вас данные с gps-шилда льются, но косяк с передачей их на экран (каша), то не льются, поэтому монитор порта спутников не видит.
а?
именно так... в коде же видно что данные уходят и в сериал и на экран. Там где есть комп(сериал), нету спутников(в глубине здания, и это вполне понятно) и наоборот, я это писал чтобы объянить странный вид получаемых в сериал НМЕА строк и то что в сериал я их не могу поиметь в нормальном виде.
Косяков с передачей на экран нету. Все льется, как положено в кривом коде - кусками по приходу в буфер сериал3(жпс), переписывая поочередно куски экрана... но не так как хотелось бы.
Теперь повторю чего хотелось бы (просто я в с++ синтаксисе откровенно не силен).
Куски которые приходят из буфера добавлять к некой переменной (чар например).
По факту получения символов конца строки скопировать эту строку(до знака конца строки) в другую переменную. поставить маркер "готово"-тру.
из первой переменной отрезать лишнее и оставить только то что принадлежит новой строке и далее набивать ее из буфера...
loop
если стоит маркер "готово" {
проверить ее на соответствие CRC и разобрать строку на куски по кучке переменных.
сбросить маркер
вывести нужное на экран в нужном месте}
вот приблизительно то, о чем я вел речь, но мне кажется, что это будет работать только если в буфере 1 символ... а если больше? Или в данном случае чар безразмерный? Опять же проверка конца строки, а если в буфере не только "/n", а "блабла/n" И отдельно о объявлении стринга "name" - это в пределах допустимого?
string - текстовые строки
Текстовые строки в Ардуино объявляются как массив (array) типа char (символов - литер), оканчивающийся символом "конца строки".
Все вопросы снимаются... http://arduino.cc/en/Tutorial/HomePage п.8 есть все что надо.
Я неправильно интерпретировал данные о том что "стринг это массив чаров с /n в конце" как: "в ардуино вместо стринга принято пользовать чары с /n в конце", копипаста выше. Нада ж так утупить... ессно с чарами то же провернуть сложнее и главное ни один поиск не поможет.