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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> Принцип построения консоли управления устройством, Поделитесь опытом кто как делает :)
C.S.
сообщение Aug 25 2009, 13:54
Сообщение #46


Участник
*

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



Цитата
это ж ответ от девайса пойдет только после приема команды? Тогда у Вас большой буфер для работы на RX/TX и ФИФО на прием

Эммм... А как иначе (про ответ)? Если я девайсу шлю например команду SETBR 1,100 - вот он её должен распарсить, выполнить и ответить OK? Так ведь и выходит - причём, обработка, ответ? Я по 32 байта выделил на буферы...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 25 2009, 14:03
Сообщение #47


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(C.S. @ Aug 25 2009, 16:54) *
Так ведь и выходит - причём, обработка, ответ? Я по 32 байта выделил на буферы...

Тогда нафига Вам второй буфер ? Если, конечно, во время ответа хост не пошлет еще чего-нить.
Go to the top of the page
 
+Quote Post
C.S.
сообщение Aug 25 2009, 14:17
Сообщение #48


Участник
*

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



Так а если надо будет вернуть чего-то более разумное в ответ, нежели ОК? Тогдабудет ОК <данные>
Вот и думал(ю) сделать буфер на отправку: забиваем его всем, чем надо, вызываем подпрограмму, которая по прерываниям его автономно отсылает.
Можно, конечно и так: отослать ОК, отослать пробел, отослать данные - но логическая целостность как-то теряется.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 25 2009, 14:36
Сообщение #49


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(C.S. @ Aug 25 2009, 17:17) *
Так а если надо будет вернуть чего-то более разумное в ответ, нежели ОК? Тогдабудет ОК <данные>

1. Принимаем команду в буфер
2. Парсим ее в буфере
3. Все аргументы - преобразуются и хранятся в локальных переменных.
4. Выполняются действия с полученным набором аргументов.
5. Ответ отправляется в тот же буфер. Ставится счетчик TxCNT = длине отправляемой строки
6. Разрешаем UDRE. (в нем отправляем и как только TxCNT ==0 запрещаем прерывание)
7. Ждем пока UDRE не станет ==0
За это время FIFO - если может заполниться - то оставьте его 32 байта, если низзя принимать команду - оставляйте меньше. Если новая команда не может поступить ранее, чем отдан ответ, этот факт фиксируется с помощью переполнения ФИФО, и далее - ответ, типа "?"
Go to the top of the page
 
+Quote Post
C.S.
сообщение Aug 25 2009, 15:18
Сообщение #50


Участник
*

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



Понял. Идиот. Спасибо большое!
Go to the top of the page
 
+Quote Post
C.S.
сообщение Aug 27 2009, 09:33
Сообщение #51


Участник
*

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



Парсинг команд сделал. Использовал побайтовое сравненпие буфера в цикле, одновременно считая побайтово команду из памяти программ. Команды закодировал так:
Код
UARTCmdListTable:
.DB    8,    /*ОБЩЕЕ ЧИСЛО КОМАНД в ШТУКАХ!*/    \
    2,    "UP",        /*01: Кнопка "Вверх"*/        \
    3,    "DWN",        /*02: Кнопка "Вниз"*/    \
    4,    "LAMP",        /*03: Кнопка "Вкл-Выкл" (ON|OFF)*/    \

Соответственно - считаем числа, грузим в счётчики - и циклом крутимся. Нашли - из таблицы
Код
UARTCmdProcTable:
.DW    UARTCommand_UP;01
.DW    UARTCommand_DWN;02
.DW    UARTCommand_LAMP;03

выбираем нужный адрес и ICALL. Работает. Получилось, видимо,также как на СИ с массивом. Команда получает позицию её аргументов в буфере и делает с ними что хочет.

Сообщение отредактировал C.S. - Aug 27 2009, 09:34
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Aug 27 2009, 14:19
Сообщение #52


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(C.S. @ Aug 27 2009, 12:33) *
Команды закодировал так:


По идее, ОБЩЕЕ ЧИСЛО КОМАНД в ШТУКАХ! можно определить директивой equ.
Во-вторых, в своем первом посте (на который zltigo сказал "с размахом") я не договорил, что если имеется ситуация, когда для нескольких команд есть одинаковый набор аргументов (одинаковое кол-во и тип и даже диапазон иногда) - то зачем плодить сущности, можно сам парсинг утрясти/утоптать. Т.е аргументы уже будут считаны, преобразованы и уложены куда надо, а потом по индексу - вызываем нужную функцию. Разумеется, это не принципиально, так, не более, чем свое имхо.
Go to the top of the page
 
+Quote Post
C.S.
сообщение Aug 27 2009, 14:45
Сообщение #53


Участник
*

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



Хм, попробую и так. Просто делить их по запятой. А насчёт EQU - стиля кода придерживаюсь, тут специально исключение сделано: вся запись - одна строка вида <Всего><Длина1><Текст1><Длина2><Текст2>...
Гоняю сейчас прогу (на ВБ быстро написал), или по терминалу - распознаёт, даже HELP выводит %)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:20
Рейтинг@Mail.ru


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