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

Участник

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

|
Цитата это ж ответ от девайса пойдет только после приема команды? Тогда у Вас большой буфер для работы на RX/TX и ФИФО на прием Эммм... А как иначе (про ответ)? Если я девайсу шлю например команду SETBR 1,100 - вот он её должен распарсить, выполнить и ответить OK? Так ведь и выходит - причём, обработка, ответ? Я по 32 байта выделил на буферы...
|
|
|
|
|
Aug 25 2009, 14:36
|
;
     
Группа: Участник
Сообщений: 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 байта, если низзя принимать команду - оставляйте меньше. Если новая команда не может поступить ранее, чем отдан ответ, этот факт фиксируется с помощью переполнения ФИФО, и далее - ответ, типа "?"
|
|
|
|
|
Aug 27 2009, 09:33
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Aug 27 2009, 14:19
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(C.S. @ Aug 27 2009, 12:33)  Команды закодировал так: По идее, ОБЩЕЕ ЧИСЛО КОМАНД в ШТУКАХ! можно определить директивой equ. Во-вторых, в своем первом посте (на который zltigo сказал "с размахом") я не договорил, что если имеется ситуация, когда для нескольких команд есть одинаковый набор аргументов (одинаковое кол-во и тип и даже диапазон иногда) - то зачем плодить сущности, можно сам парсинг утрясти/утоптать. Т.е аргументы уже будут считаны, преобразованы и уложены куда надо, а потом по индексу - вызываем нужную функцию. Разумеется, это не принципиально, так, не более, чем свое имхо.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|