Страница 1 из 1

Парсер команд на C для кофигурирования МК по UART

Добавлено: Пн ноя 29, 2010 23:18:22
Inspiron
Может кто сталкивался с проблемой, хочу конфигурировать AVR микроконтроллер по UART. Но столкнулся с проблемой.
Предположим я хочу видеть обмен с мк вида

Я: CONFIG
МК: CONFIG>
Я:LINE 1
MK:CONFIG / LINE 1>
Я: ENABLE
МК: LINE 1 : ENABLE

Вся проблема в том, как со стороны МК распознать какая команда пришла и перейти к соответствующему участку программы? Может у кого есть наработки на С/С++ или кто знает где это искать.

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Пн ноя 29, 2010 23:23:38
Alex_EXE
Можно реализовать на метках (goto) или множественной выборкой (switch)

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Вт ноя 30, 2010 13:12:36
РадиоЛоматель
Вложенными switch-ами, самый наверное простой и сердитый вариант.
Можно сделать сопоставление строке номера, а потом уже только один свитч. Объявить массив строк, в котором все возможные команды, и в цикле искать нужную. Но это медленно, зато код компактней будет.

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Вт ноя 30, 2010 20:22:45
Inspiron
Ну то что case'ами или метками это понятно. меня немного другое интересует, UART принимает поток символов, как из него вычленить команду? как сравнить ее с другой строкой (методами сравнивания строк из С++ или методом побайтного сравнивания в цикле?). Вообще не мог бы кто нибудь примерчик привести, как это делается.

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Вт ноя 30, 2010 21:34:24
Alex_EXE
Вам нужно сформировать что-то вроде пакета или фиксированной длины, или с указанием длины в начале, или ввести символы начала и конца. В этом пакете вы сможете передавать команды и значения. Команды можно передавать как текстом, но если их немного - лучше байтом или парой байтов, заодно и легче будет switch'ем обрабатывать такие команды.

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Вт ноя 30, 2010 22:31:34
Fasterpast
Для начала можно просто сделать по числу:
Скажем если 00000001 - начало программы, если 00000010, то еще что-то.
Тогда оч просто:
Прерывание -> запись этого числа в переменную, goto, обнудение переменной и тд

Если команды должны быть посложнее, то нужно делать какой-то буфер.
Создаётся массив, по прерыванию каждый байт пишется в следующий элемент массива.
Цикл сравнивает каждый элемент пока не находит ключевой начальный символ, и дальше считывает всё остальное, а потом уже и строковые сравнение, и всё что захотите.

Не знаю, может есть более красивые методы, но я себе делал так, вроде работает )

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Чт дек 02, 2010 22:34:10
РадиоЛоматель
А чего тут думать: С кейсами проще всего:
Пришел символ, мы отправляем его в верхний свитч, где он сравнивается с первыми символами всех команд в кейсах, если совпало-то мы внутри этого кейса ждем прихода второго символа, и отправляем его на внутренний свитч уже в данном кейсе. Ну где то так:

Код: Выделить всё

char a;
a=read(); //Условно "функция чтения"
switch(a)
{
  case 'c':
    a=read();
    switch(a)
    {
       case 'o':
         //делаем действия, согласно команде "со"
         break;
       default:
         //Действия "Нет такой команды"
         break;
    }
    break;
  default:
     //Действия "Нет такой команды"
     break;
}


Ну я думаю, суть ясна.

Но, правда, можно тогда принять комаду, например, "мсо" за команду "со".

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Чт дек 02, 2010 22:59:17
Aheir
Inspiron писал(а):Ну то что case'ами или метками это понятно. меня немного другое интересует, UART принимает поток символов, как из него вычленить команду? как сравнить ее с другой строкой (методами сравнивания строк из С++ или методом побайтного сравнивания в цикле?). Вообще не мог бы кто нибудь примерчик привести, как это делается.


Можно решать вопрос на уровне организации протокола (т.е. использовать, паример, команды фиксированной, известной длины). Из методов С иногда удобно scanf() использовать (если ресурсы позволяют). Можно массив перебирать... Вариантов масса, в чем вопрос-то?

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Пт дек 03, 2010 12:13:15
kolobok0
Inspiron писал(а):... UART принимает поток символов, как из него вычленить команду?...


тут только два метода
1) временной. опираясь на временные задержки детектить фрэймы.
2) детектить старт фрэйма из самого потока данных.

как правило применяют оба. основной и вспомогательный для отсева ошибок или ошибочных состояний.

для скорости дешифровки команд необходимо оперировать той разрядностью, которая поддерживается железом.
например: оперируем байтами => анализ(кэйсы) на уровне байтов.
оперируем на уровне слов(16 бит) => анализ на уровне слов.
и т.п.

для универсального алгоритма - тут уже прозвучало: перебор списка, при совпадении => переход.

удачи вам
(круглый)

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Пт дек 03, 2010 12:27:09
ARV
что-то тут пошло не в ту степь, по-моему... какие фреймы, какие байты? проще надо быть, граждане, проще!
каждая строка в консоли завершается вводом ENTER. МК принимает в буфер все, пока не получит код \n - это знак конца введенной строки-команды. получив этот код, МК формирует строку для анализа, а затем при помощи strcmp в цикле сравнивает полученную строку со строками в своем массиве. нашел строку - переходит к выполнению соответствующей функции, не нашел - вывел сообщение об ошибке...

просто и понятно.

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Сб дек 04, 2010 19:42:13
Inspiron
Действительно просто и понятно. Меня смущало то, что strcmp будет сильно грузить МК, я думал может какие то другие функции сравнения есть, но попробую реализовать на этом.

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Сб дек 04, 2010 21:00:56
Fasterpast
Если посмотреть код который получается при strcmp, можно увидеть, что в итоге код получается не сильно тяжелее, чем если писать побайтовое сравнение ручками...

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Пн дек 06, 2010 07:06:49
foxit
Inspiron писал(а):Может кто сталкивался с проблемой, хочу конфигурировать AVR микроконтроллер по UART. Но столкнулся с проблемой.
Предположим я хочу видеть обмен с мк вида

Я: CONFIG
МК: CONFIG>
Я:LINE 1
MK:CONFIG / LINE 1>
Я: ENABLE
МК: LINE 1 : ENABLE

Вся проблема в том, как со стороны МК распознать какая команда пришла и перейти к соответствующему участку программы? Может у кого есть наработки на С/С++ или кто знает где это искать.


А есть пример?

Re: Парсер команд на C для кофигурирования МК по UART

Добавлено: Пн дек 06, 2010 09:35:43
Alex_EXE
Еще можно посчитать контрольную сумму (например crc8 или хитрым образом сложить все байты) и уже контрольную сумму в switch пихать.