реклама на сайте
подробности

 
 
> Принцип построения консоли управления устройством, Поделитесь опытом кто как делает :)
mempfis_
сообщение Aug 12 2009, 08:43
Сообщение #1


Профессионал
*****

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



Стоит задача разаработать устройство которое должно иметь возможность управляться через UART.
Думаю встроить отладочную консоль чтобы можно было посылать в устройство комманды и получать ответы.
Комманды в виде одиночных символов реализовал. Теперь хочу расширить функциональность консоли и реализовать длинные команды
(наподобие АТ-комманд). Причём хочется сделать аппаратно-независимую консоль чтобы можно было переносить из проекта в проект меняя только низкоуровневые функции приёма/отправки символовов через UART.

Подскажите кто как делает подобные консоли. Интересует прежде всего как осуществляется поиск комманд в потоке принимаемых символов (выделение слов длиной 2 и более символа)? Какие стандартные библиотеки можно использовать?

Сейчас реализована входная FIFO-UART которая заполняется в прерываниях и функция считывания символа из FIFO которая возвращает -1 если нет данных или принятый символ. Одиночные символы отлавливать легко (считал - обработал), два - уже сложнее но пока реализую устанавливая флаги.
Как отловить три и более символа - вот тут нужны идеи smile.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Goodefine
сообщение Aug 12 2009, 15:50
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581



Цитата(Dog Pawlowa @ Aug 12 2009, 18:44) *
Это что, длинные команды как средство нейтрализации ошибок реализации протокола? smile.gif

Не совсем smile.gif
В качестве контрпримера можно рассмотреть поведение управляемого объекта, с односимвольным набором команд, на вход которого постоянно что-то приходит. Без ошибок. При прочих равных, разумеется...


--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 12 2009, 17:21
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Goodefine @ Aug 12 2009, 18:50) *
В качестве контрпримера можно рассмотреть поведение управляемого объекта, с односимвольным набором команд, на вход которого постоянно что-то приходит. Без ошибок. При прочих равных, разумеется...

И что, как контрпример себя ведет?
Использую односимвольные наборы команд в обе стороны. Никаких проблем.
Очень удобно - в одну сторону идут коды нажатых клавиш, а в другую - коды символов, подлежащих отображению. Полный дуплекс, физический и логический. Если русский язык не нужен, коды управления дисплеем помещаются в правую сторону ASCII без проблем.
Тут главное - не пытаться придумывать что-то посредине между "простым" протоколом и "нормальным" протоколом, в результате получится зависающая хрень.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 12 2009, 17:49
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Dog Pawlowa @ Aug 12 2009, 23:21) *
Очень удобно - в одну сторону идут коды нажатых клавиш, а в другую - коды символов, подлежащих отображению. Полный дуплекс, физический и логический.


Но это вроде немного не то, что хотел топикстартер?

Я лично применяю более-менее полноценную консоль, типа такого:

CODE
// обработчик команды.
typedef int (* CmdHandler)(char * args);

// структура с информацией о команде
typedef struct
{
char * command_name; // имя
CmdHandler handler; // обработчик
}
Command;

const Command CommandTable[] =
{
{"GET", GetCommandHandler},
{"SET", SetCommandHandler},
{"TERM", TermHandler},
...
};

int parse_command_line(char * buf)
{
char *lt;
char *token;
int i;

token = GetToken(buf, &lt);
if (!token) return FALSE;

for (i=0; i<sizeof(CommandTable) / sizeof(CommandTable[0]); i++)
if (!strcmp(CommandTable[i].command_name, token))
{
if (!CommandTable[i].handler)
return FALSE;
return CommandTable[i].handler(lt);
}

return FALSE;
}

void interpreter(void)
{
char buf[81];
for (;;)
{
rs_puts("\r\n=>");
rs_gets(buf, 80);
if (!parse_command_line(buf))
rs_puts("ERR");
}
}


Гораздо приятнее писать "SET PARAM1=23.4", чем "sA34", имея заодно возможность отредактировать строку при неверном вводе.
Да и не накладно это особо.
Причина редактирования: Уменьшение видимого размера цитаты исходника.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Aug 12 2009, 18:27
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(AHTOXA @ Aug 12 2009, 20:49) *
Гораздо приятнее писать "SET PARAM1=23.4"...


Если уж пошла речь о том, что приятнее, то я пришел к выводу, что лучше ПиСишное приложение, одно на все устройства, а из устройства может быть прочитано, какой физический смысл имеет PARAM1. Типа SNMP.

Хотя протокол именно текстовый - чтобы было "приятнее писать".


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - 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
- - C.S.   2_Pasha Кхм, я путаюсь уровнем ниже. Как принимаем...   Aug 25 2009, 12:25
|- - _Pasha   Цитата(C.S. @ Aug 25 2009, 15:25) Первый ...   Aug 25 2009, 12:58
|- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01468 секунд с 7
ELECTRONIX ©2004-2016