|
USART и NMEA |
|
|
|
Dec 28 2011, 13:54
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 20-11-10
Пользователь №: 61 036

|
Здравствуйте!
Надо ли преобразовывать как-то ASCII коды, которые получаю по USART, (типичная последовательность NMEA $GPZDA,102433.00,28,12,2011,,*6A, из которой мне нужны только 2-5 поля)? (я так понимаю, что не надо)
Не подскажите более удачный алгоритм считывания символов с USARTa, кроме как перечисление if'ов?
|
|
|
|
|
 |
Ответов
|
Dec 29 2011, 05:02
|
Знающий
   
Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163

|
Я 3 раза перечитал, но так и не понял сути вопроса. Цитата Надо ли преобразовывать как-то ASCII коды, которые получаю по USART Ну если начальство сказало, что надо, то преобразовывайте. Цитата Не подскажите более удачный алгоритм считывания символов с USARTa, кроме как перечисление if'ов? Более удачный алгоритм - считывать с юсарта без ифов. Я вот считываю и перечисления ифов нет. Делаю я это так: считываю байт, если приёмник не пуст, повторяю в цикле.
|
|
|
|
|
Dec 29 2011, 11:39
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 20-11-10
Пользователь №: 61 036

|
Цитата(andrewlekar @ Dec 29 2011, 08:02)  Я 3 раза перечитал, но так и не понял сути вопроса. Потому я такие вопросы и задаю, что новичок как в С++, так и в программировании контроллеров. Занимаюсь ими месяцев 8-9, периодически отрываясь от основной работы. Цитата Ну если начальство сказало, что надо, то преобразовывайте. Начальство тут не при чём, тут дело в непонимании. Мой алгоритм примерно выглядит так: CODE while (!Character==32) { while ( ! (USART1->SR & USART_SR_RXNE) ) ; // ждать, пока символ не получен { CharNum++; if (CharNum==1) { USART1->SR &=~ USART_SR_RXNE;} // пропустить 1-ый символ if (CharNum==3) { Character = (USART1->DR & 0x1FF ) ;} // считать 2-ой символ ..... Получается, что я каждый символ должен посчитать, а их 32, через оператор if. Цитата Следующий этап - синтаксический анализ. В этом случае он тривиален, из входного потока лексем просто лишние выбрасываются, нужные сохраняются. Цитата Делаю я это так: считываю байт, если приёмник не пуст, повторяю в цикле. Вот я и спрашиваю, как это сделать (на уровне кода)? можно ли это упростить с помощью языка? А не использовать для этого 60 строчек кода.
|
|
|
|
|
Dec 29 2011, 12:14
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(MarYuriy @ Dec 29 2011, 13:39)  Потому я такие вопросы и задаю, что новичок как в С++, так и в программировании контроллеров. Занимаюсь ими месяцев 8-9, периодически отрываясь от основной работы. Начальство тут не при чём, тут дело в непонимании. Мой алгоритм примерно выглядит так: CODE while (!Character==32) { while ( ! (USART1->SR & USART_SR_RXNE) ) ; // ждать, пока символ не получен { CharNum++; if (CharNum==1) { USART1->SR &=~ USART_SR_RXNE;} // пропустить 1-ый символ if (CharNum==3) { Character = (USART1->DR & 0x1FF ) ;} // считать 2-ой символ ..... Получается, что я каждый символ должен посчитать, а их 32, через оператор if. Вот я и спрашиваю, как это сделать (на уровне кода)? можно ли это упростить с помощью языка? А не использовать для этого 60 строчек кода. Непонятен алгоритм, который вы пытаетесь реализовать. Код while (!Character==32) Не буду утверждат, что символ 32 вообще не встречается в NMEA. мало ли. Но то что не характерен - точно. Типичная NMEA посылка, например: $GPRMC,данные в формате, какие должны быть по стандарту.*КС\r\n КС- контрольная сумма, вычисляемая так; xor всех байт от $ до * (не включая их). \r\n - перевод строки. Цитата Получается, что я каждый символ должен посчитать, а их 32, через оператор if. Почему 32? Некоторые поля могут иметь фиксированный фориат (и при этом иногда отсутствовать в строке - быть пустуми).
|
|
|
|
|
Dec 29 2011, 13:00
|
Участник

Группа: Участник
Сообщений: 59
Регистрация: 20-11-10
Пользователь №: 61 036

|
Цитата(_Артём_ @ Dec 29 2011, 15:14)  Непонятен алгоритм, который вы пытаетесь реализовать. while (!Character==32)[/code] Почему 32? Некоторые поля могут иметь фиксированный фориат (и при этом иногда отсутствовать в строке - быть пустуми). Я ошибся, просто быстро накидал часть кода, как вижу решение. Должно быть while (!CharNum==32) 32 символа передаётся в одном пакете $GPZDA. Цитата Ты ЩО дурный (С) Без обид Я думал, что вчера написал, что мне нужно вычленить только определённые символы из этой последовательности: время без десятых и сотых, и дату. А сейчас не мог понять, зачем мне пишут то, что и так понятно ещё и ругают... Спать надо больше. Извиняюсь. А сам вопрос звучит так: как вычленить только определённые символы из этой последовательности: время без десятых и сотых, и дату? вот. т.е. в моём варианте примерно так(если я опять нигде не ошибся) CODE while (!CharNum==32) { while ( ! (USART1->SR & USART_SR_RXNE) ) ; // ждать, пока символ не получен { CharNum++; if (CharNum==1) { USART1->SR &=~ USART_SR_RXNE;} // пропустить 1-ый символ , // то же для 2,3-7
if (CharNum==8) { Character = (USART1->DR & 0x1FF ) ;} // считать 2-ой символ // то же для 9,10-13 // и т.д.
|
|
|
|
Сообщений в этой теме
MarYuriy USART и NMEA Dec 28 2011, 13:54    _Артём_ Цитата(MarYuriy @ Dec 29 2011, 15:00) Я о... Dec 29 2011, 16:15 SSerge Повышаем градус абстракции!
От GPS-модуля ведь... Dec 29 2011, 06:20 MKdemiurg Ты ЩО дурный (С) Без обид
У тебя сообщение нач... Dec 29 2011, 11:56 Kuzmi4 2 MarYuriy
Там кстати не всё железо даёт sentence ... Dec 29 2011, 12:08 andrewlekar Цитатаwhile (!CharNum==32)
Во-первых, такой ко... Dec 30 2011, 04:46 MarYuriy _Артём_, я использую Trimble Resolusion-T. Если да... Dec 30 2011, 12:03 lexanet Посмотрите LPC1768. Установка времени. (WEB&GP... Jan 6 2012, 17:11 MarYuriy Как организовать буфер я нашёл. А вот как работать... Jan 10 2012, 17:43 Cosmojam Цитата(MarYuriy @ Jan 10 2012, 20:43) Как... Jan 10 2012, 18:22  WHALE Цитата(Cosmojam @ Jan 10 2012, 22:22) Чуд... Jan 11 2012, 04:24   Cosmojam Цитата(WHALE @ Jan 11 2012, 07:24) Та лад... Jan 11 2012, 09:05    _Артём_ Цитата(Cosmojam @ Jan 11 2012, 11:05) Там... Jan 12 2012, 11:44 lexanet Не такая и тяжелая эта операция. У меня счас буфер... Jan 11 2012, 05:15 Cosmojam Это что-то вроде дерева получается, должно быть оч... Jan 13 2012, 13:03 _Артём_ Цитата(Cosmojam @ Jan 13 2012, 15:03) А е... Jan 13 2012, 14:36 kan35 В свое время столкнулся с задачей разбора RMC и GG... Jan 14 2012, 07:17 Alexey K Решил задать два вопроса здесь чтобы не плодить те... Jun 13 2012, 06:30 V_G Цитата(Alexey K @ Jun 13 2012, 16:30) Доп... Jun 13 2012, 07:01 Alexey K Данные я формирую так что по первому пункту первом... Jun 13 2012, 07:12
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|