|
Принцип построения консоли управления устройством, Поделитесь опытом кто как делает :) |
|
|
|
Aug 12 2009, 08:43
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Стоит задача разаработать устройство которое должно иметь возможность управляться через UART. Думаю встроить отладочную консоль чтобы можно было посылать в устройство комманды и получать ответы. Комманды в виде одиночных символов реализовал. Теперь хочу расширить функциональность консоли и реализовать длинные команды (наподобие АТ-комманд). Причём хочется сделать аппаратно-независимую консоль чтобы можно было переносить из проекта в проект меняя только низкоуровневые функции приёма/отправки символовов через UART. Подскажите кто как делает подобные консоли. Интересует прежде всего как осуществляется поиск комманд в потоке принимаемых символов (выделение слов длиной 2 и более символа)? Какие стандартные библиотеки можно использовать? Сейчас реализована входная FIFO-UART которая заполняется в прерываниях и функция считывания символа из FIFO которая возвращает -1 если нет данных или принятый символ. Одиночные символы отлавливать легко (считал - обработал), два - уже сложнее но пока реализую устанавливая флаги. Как отловить три и более символа - вот тут нужны идеи
|
|
|
|
|
 |
Ответов
|
Aug 25 2009, 12:25
|

Участник

Группа: Участник
Сообщений: 52
Регистрация: 6-05-09
Из: Москва
Пользователь №: 48 733

|
2_Pasha Кхм, я путаюсь уровнем ниже. Как принимаемое пихать в буфер и что делать, если будут слать следующую команду,пока обрабатывается текущая. Думаю отключать UART на приём(?). То-есть есть отдельно принималка строки и есть отдельно парсер. Вот с принималкой строки затыки следующие: 0. Есть область памяти и счётчик адреса = буфер. Так? 1.1. По прерыванию пихаем байт, инкрементируем счётчик, проверяем переполнение счётчика, выдаём ошибки, если надо (переполнен буфер). 1.2. После принятия очередного байта проверяем два последних на CRLF. Если равны = отключаем приём, передаём буфер парсеру. 2. Парсер уже сам разбирается - команда/ошибка, выдаёт ответ или выполняет её, в конце разрешая приём.
Есть ли тут какие-то подводные камни? Первый вижу сам - пока обрабатываем что-то, теряем посылаемое в этот момент. Это я закладываю в протокол: если не пришёл ответ от команды, повторить посылку.
И ещё непонятно с таймаутом - как его посчитать? Выходит что-то типа ватчдога? Или вообще не делать, а просто ждать CRLF?
Видел модуль, там типа терминала через RS-232 написано, так, вроде там таймаута нет никакого. Просто строка кончается CRLF.
|
|
|
|
|
Aug 25 2009, 12:58
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(C.S. @ Aug 25 2009, 15:25)  Первый вижу сам - пока обрабатываем что-то, теряем посылаемое в этот момент. Это я закладываю в протокол: если не пришёл ответ от команды, повторить посылку. Тогда FIFO (пардон за Си): Код volatile char buffer[BUFSIZE]; volatile unsigned char pos_rd, pos_wr;
// прерывание UART { char tmp=UDR; buffer[pos_wr++] = tmp; if(pos_wr >= BUFSIZE ) pos_wr = 0; }
// опр числа принятых символов // условие кгда нет символов одно - это pos_wr == pos_rd unsigned char sym_pending(void) { return (pos_wr >= pos_rd) ? (pos_wr - pos_rd) : ( pos_wr + BUFSIZE - pos_rd); } // чтение из буфера char sym_read(void) { char tmp = buffer[pos_rd++]; if(pos_rd >= BUFSIZE) pos_rd = 0; return tmp; } Цитата И ещё непонятно с таймаутом - как его посчитать? Выходит что-то типа ватчдога? Для начала определитесь, для чего именно Вам таймаут. Он может быть как на время между принятыми командами, так и на время между символами. ЗЫ для определения переполнения буфера можно параллельно ввести счетчик принятых байт. При чтении - декрементировать его.
|
|
|
|
Сообщений в этой теме
mempfis_ Принцип построения консоли управления устройством Aug 12 2009, 08:43 ukpyr нужен приемный буфер на макс.количество символов в... Aug 12 2009, 10:17 _Pasha Собираете словарь команд (ASCIIZ), например
Кодcon... Aug 12 2009, 10:26 zltigo Цитата(_Pasha @ Aug 12 2009, 13:26) Собир... Aug 12 2009, 11:24  _Pasha Цитата(zltigo @ Aug 12 2009, 14:24) Станд... Aug 12 2009, 11:40  AlexMad Цитата(zltigo @ Aug 12 2009, 15:24) С раз... Aug 20 2009, 18:52   zltigo Цитата(AlexMad @ Aug 20 2009, 20:52) А не... Aug 20 2009, 19:23 DpInRock Длинные команды - бессмысленное пижонство. Aug 12 2009, 12:06 Goodefine Зато обеспечивают детерминированное поведение сист... Aug 12 2009, 14:31 Dog Pawlowa Цитата(Goodefine @ Aug 12 2009, 17:31) За... Aug 12 2009, 15:44 Goodefine Цитата(Dog Pawlowa @ Aug 12 2009, 18:44) ... Aug 12 2009, 15:50 Dog Pawlowa Цитата(Goodefine @ Aug 12 2009, 18:50) В ... Aug 12 2009, 17:21  AHTOXA Цитата(Dog Pawlowa @ Aug 12 2009, 23:21) ... Aug 12 2009, 17:49   Dog Pawlowa Цитата(AHTOXA @ Aug 12 2009, 20:49) Гораз... Aug 12 2009, 18:27    AHTOXA Цитата(Dog Pawlowa @ Aug 13 2009, 00:27) ... Aug 12 2009, 19:06    _Pasha Цитата(Dog Pawlowa @ Aug 12 2009, 21:27) ... Aug 12 2009, 19:10 SasaVitebsk Читал протокол Пирамида. Правда это надпротокольны... Aug 12 2009, 19:08 Goodefine Цитата(Dog Pawlowa @ Aug 12 2009, 20:21) ... Aug 12 2009, 19:32 Dog Pawlowa Цитата(Goodefine @ Aug 12 2009, 22:32) В ... Aug 13 2009, 02:18 _Pasha Цитата(zltigo @ Aug 12 2009, 14:24) Код..... Aug 13 2009, 05:02 AHTOXA Цитата(_Pasha @ Aug 13 2009, 11:02) Ничег... Aug 13 2009, 05:45  _Pasha Цитата(AHTOXA @ Aug 13 2009, 08:45) Как р... Aug 13 2009, 05:52   AHTOXA Что-то не могу себе представить... Расскажите чуть... Aug 13 2009, 06:00    _Pasha Цитата(AHTOXA @ Aug 13 2009, 09:00) как, ... Aug 13 2009, 06:09     AHTOXA Насколько я понял, автор темы хочет консоль управл... Aug 13 2009, 06:17      mempfis_ Цитата(AHTOXA @ Aug 13 2009, 09:17) Наско... Aug 13 2009, 06:41       SasaVitebsk Цитата(mempfis_ @ Aug 13 2009, 09:41) ... Aug 13 2009, 16:01 _Pasha Цитата(AHTOXA @ Aug 13 2009, 09:17) Наско... Aug 13 2009, 07:02 AHTOXA Цитата(_Pasha @ Aug 13 2009, 13:02) Но, в... Aug 13 2009, 07:23  _Pasha Цитата(AHTOXA @ Aug 13 2009, 10:23) проще... Aug 13 2009, 07:33   AHTOXA Цитата(_Pasha @ Aug 13 2009, 13:33) Ага. ... Aug 13 2009, 09:30 rezident В дополнение ко всему хотел бы заметить, что конфи... Aug 13 2009, 19:03 SasaVitebsk Цитата(rezident @ Aug 13 2009, 22:03) В д... Aug 14 2009, 06:54  MrYuran Цитата(SasaVitebsk @ Aug 14 2009, 10:54) ... Aug 14 2009, 07:13 amaora Обычно использую бинарный протокол для отладки, но... Aug 14 2009, 17:02 defunct ЦитатаПринцип построения консоли управления устрой... Aug 15 2009, 15:52 C.S. Цитата(mempfis_ @ Aug 12 2009, 12:43) Сей... Aug 25 2009, 11:56 _Pasha Цитата(C.S. @ Aug 25 2009, 14:56) Смущает... Aug 25 2009, 12:08 AHTOXA Цитата(C.S. @ Aug 25 2009, 18:25) Как при... Aug 25 2009, 13:03 C.S. На время между символами. Наверное, может и не нуж... Aug 25 2009, 13:02 _Pasha Цитата(C.S. @ Aug 25 2009, 16:02) А sym_p... Aug 25 2009, 13:17 C.S. ЦитатаРазворачиваем это все в другой буфер (к сожа... Aug 25 2009, 13:26 _Pasha Цитата(C.S. @ Aug 25 2009, 16:26) Аааа... Aug 25 2009, 13:36 C.S. Цитатаэто ж ответ от девайса пойдет только после п... Aug 25 2009, 13:54 _Pasha Цитата(C.S. @ Aug 25 2009, 16:54) Так вед... Aug 25 2009, 14:03 C.S. Так а если надо будет вернуть чего-то более разумн... Aug 25 2009, 14:17 _Pasha Цитата(C.S. @ Aug 25 2009, 17:17) Так а е... Aug 25 2009, 14:36 C.S. Понял. Идиот. Спасибо большое! Aug 25 2009, 15:18 C.S. Парсинг команд сделал. Использовал побайтовое срав... Aug 27 2009, 09:33 _Pasha Цитата(C.S. @ Aug 27 2009, 12:33) Команды... Aug 27 2009, 14:19 C.S. Хм, попробую и так. Просто делить их по запятой. А... Aug 27 2009, 14:45
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|