Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: ivan_fd  
приём ASCI команд (символьных строк разной длины) по USART
vsky Дата: Пн, 14.12.2009, 12:14  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 50
Репутация: 0   ±
Замечания:   ±
На сайте с 23.09.2008

Статус: Offline

Доброго времени суток уважаемые форумчане!

Собственно вопрос- как реализовать ветвление в программе в зависимости от принятого сообщения по USART. Сложность в том что модификаторы оператора HSERIN не позволяют сделать подобного. Заранее необходимо знать количество символов. При приёме единичных символов необходимо постоянно сравнивать цепочки символов из программного буфера приёма с некоторыми образцами (символьными константами). А это довольно сложная рутина, при том что это не единственное что должна делать программа.

Может быть есть изящные решения (наподобие LOOKUP, LOOKDOWN)?

Кто нибудь сталкивался с подобным?

Может быть решения данной задачи обсуждались на импортных сайтах?

Может есть какие-либо макросы, inc или asm-вставки?

Надеюсь, что я внятно изложил свою проблему.

Огромная благодарность каждому ответевшему smile

ЯНДЕКС Дата: 14.12.2009
ADMIN Дата: Вт, 15.12.2009, 00:00  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

А в примерах я нашел вот что:
Можно так:
Code

DEFINE HSER_BAUD 2400   ' Select the baud rate
char var byte      ' Storage for serial character
RES var BYTE
Start:
  Hserout ["GO!", 13, 10] ' Отправляем байт-команду на начало передачи из терминала
loop_:  
    Hserin 3000, start, [char]    ' Принимаем символ. Если за 3 сек нет ничего, то переходим на Start
    LOOKDOWN CHAR,["0123456789ABCDEF"],RES 'Преобразуем символы в десятичное число. Естественно, они могут быть другими, но по байту каждый!
'  А здесь, в зависимости от числа в переменной RES
'  выполняем нужные действия
    Goto loop_              ' Сначала.....

    End
vsky Дата: Вт, 15.12.2009, 10:59  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 50
Репутация: 0   ±
Замечания:   ±
На сайте с 23.09.2008

Статус: Offline

ADMIN, спасибо что откликнулись на просьбу о помощи! smile

С односимвольными командами сложностей вроде нет. Проблема в том, что команды с хоста имеют вид (к примеру) "START", "STOP", "SELECT+parametr".

Логика моих рассуждений привела меня к следующему: приём байтов осуществляю в прерываниях в программный буфер, там же идёт их накопление. Обработчик прерывания написан большей частью на ассемблере. Основная программа непрерывно сравнивает цепочки "ART',"TOP',"ECT" (неповторяющиеся куски исходных команд) с содержимым буфера. Но правда жизни такова, что мой PIC16F876A на 4MHz не успевает реагировать на команды с хоста (19200), а хотелось бы ещё внешний SPI АЦП опрашивать. Буду пробовать 20MHz и сравнивать "RT","OP","CT" .

Может меня кто поправит или подкинет ещё идеи? cool

ADMIN Дата: Вт, 15.12.2009, 17:40  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1086
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Во всяком случае, попробовать можно.
А если попробовать каждой команде присвоить не длинные имена, а символы алфавита?
sanek Дата: Вт, 15.12.2009, 21:04  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Понимаю
Сообщений: 84
Репутация: 0   ±
Замечания:   ±
На сайте с 09.04.2009

Статус: Offline

я так делал:
DIM CHAR[15] AS STRING
START:
HSERIN [WAIT(AT)] 'ЖДЕМ ПОКА ПРИДЕТ "АТ"(перед каждой командой нужно посылать "АТ"как предупреждение что нужно принять данные ATSTOP,ATSTART)
HSERIN 100,IDENT,[CHAR]'ПРИНИМАЕМ ДАННЫЕ В ТЕЧЕНИИ 100 МИЛЛИСЕКУНД В ПЕРЕМЕННУЮ CHAR И ИДЕМ НА МЕТКУ IDENT
IDENT:
IF CHAR[0]="S" AND CHAR[1]="T" AND CHAR[2]="A" AND CHAR[3]="R" AND CHAR[4]="T" THEN ЕСЛИ ПРИНЯЛИ КОМАНДУ "START" ТО ИДЕМ ТУДА- ТО
IF CHAR[0]="S" AND CHAR[1]="T" AND CHAR[2]="O" AND CHAR[3]="P" THEN ЕСЛИ ПРИНЯЛИ КОМАНДУ "STOP" ТО ИДЕМ ТУДА- ТО
IF CHAR[0]="S" AND CHAR[1]="E" AND CHAR[2]="L" AND CHAR[3]="E" AND CHAR[4]="C" AND CHAR[5]="T" THEN ЕСЛИ ПРИНЯЛИ КОМАНДУ "SELECT" ТО ИДЕМ ТУДА- ТО
получается длинно и не удобно по этому я ограничил свои команды до двух символов:UP,DN,LF,RT(вверх,вниз,влево,вправо)
vsky Дата: Ср, 16.12.2009, 11:29  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 50
Репутация: 0   ±
Замечания:   ±
На сайте с 23.09.2008

Статус: Offline

sanek, с метки IDENT у меня в программе тоже самое (основной цикл с разрешёнными прерываниями), только трёхсимвольное сравнение. Можно попробывать это сравнение переписать на ASM, но тут могут быть сложности с бейсиковыми прерываниями.

ADMIN, простое увеличение тактовой до 20MHz решило проблему быстродействия. Мой ПИК даже успевает отсылать ответ "ОК" хосту при трёхсимвольном сравнениии. Правда никаких действий по командам я пока не реализовал. Переход на односимвольные команды не рассматривается (софт для хоста изменению не подлежит).

Спасибо всем за участие, ведь правильно сформулировать вопрос - получить 50% ответа. smile
Буду тестировать свою программу в связке с хостовым софтом на предмет устойчивости, при дальнейшем расширении программы.

  • Страница 1 из 1
  • 1
Поиск: