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

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Аватара пользователя
Inspiron
Встал на лапы
Сообщения: 144
Зарегистрирован: Сб мар 17, 2007 19:38:52
Откуда: Североонежск\Питер
Контактная информация:

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

Сообщение Inspiron »

Может кто сталкивался с проблемой, хочу конфигурировать AVR микроконтроллер по UART. Но столкнулся с проблемой.
Предположим я хочу видеть обмен с мк вида

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

Вся проблема в том, как со стороны МК распознать какая команда пришла и перейти к соответствующему участку программы? Может у кого есть наработки на С/С++ или кто знает где это искать.
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

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

Сообщение Alex_EXE »

Можно реализовать на метках (goto) или множественной выборкой (switch)
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

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

Сообщение РадиоЛоматель »

Вложенными switch-ами, самый наверное простой и сердитый вариант.
Можно сделать сопоставление строке номера, а потом уже только один свитч. Объявить массив строк, в котором все возможные команды, и в цикле искать нужную. Но это медленно, зато код компактней будет.
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Аватара пользователя
Inspiron
Встал на лапы
Сообщения: 144
Зарегистрирован: Сб мар 17, 2007 19:38:52
Откуда: Североонежск\Питер
Контактная информация:

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

Сообщение Inspiron »

Ну то что case'ами или метками это понятно. меня немного другое интересует, UART принимает поток символов, как из него вычленить команду? как сравнить ее с другой строкой (методами сравнивания строк из С++ или методом побайтного сравнивания в цикле?). Вообще не мог бы кто нибудь примерчик привести, как это делается.
Уважаемые модераторы, сделайте пожалуйста раздел дискотечных примочек и цветомузыки. Уже много тем пылятся в бездне ветки "Умные мысли"
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

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

Сообщение Alex_EXE »

Вам нужно сформировать что-то вроде пакета или фиксированной длины, или с указанием длины в начале, или ввести символы начала и конца. В этом пакете вы сможете передавать команды и значения. Команды можно передавать как текстом, но если их немного - лучше байтом или парой байтов, заодно и легче будет switch'ем обрабатывать такие команды.
Аватара пользователя
Fasterpast
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва
Контактная информация:

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

Сообщение Fasterpast »

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

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

Не знаю, может есть более красивые методы, но я себе делал так, вроде работает )
Аватара пользователя
РадиоЛоматель
Мудрый кот
Сообщения: 1733
Зарегистрирован: Чт авг 21, 2008 22:03:30
Откуда: Одесса(Украина)
Контактная информация:

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

Сообщение РадиоЛоматель »

А чего тут думать: С кейсами проще всего:
Пришел символ, мы отправляем его в верхний свитч, где он сравнивается с первыми символами всех команд в кейсах, если совпало-то мы внутри этого кейса ждем прихода второго символа, и отправляем его на внутренний свитч уже в данном кейсе. Ну где то так:

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

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


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

Но, правда, можно тогда принять комаду, например, "мсо" за команду "со".
(*tmp) &= ~( ( (param1 & (1<<PARAM1_BIT6)) || ((param2==PARAM2_TRUE)&&(--param3)) ) ? (param1 & (~param2)) : (Func1() | FUNC1_FLAGS) );
Люблю Си...
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

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

Сообщение Aheir »

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


Можно решать вопрос на уровне организации протокола (т.е. использовать, паример, команды фиксированной, известной длины). Из методов С иногда удобно scanf() использовать (если ресурсы позволяют). Можно массив перебирать... Вариантов масса, в чем вопрос-то?
Оптимизм х (Опыт + Знания) = const
kolobok0
Грызет канифоль
Сообщения: 296
Зарегистрирован: Ср дек 30, 2009 09:55:39

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

Сообщение kolobok0 »

Inspiron писал(а):... UART принимает поток символов, как из него вычленить команду?...


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

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

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

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

удачи вам
(круглый)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Аватара пользователя
Inspiron
Встал на лапы
Сообщения: 144
Зарегистрирован: Сб мар 17, 2007 19:38:52
Откуда: Североонежск\Питер
Контактная информация:

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

Сообщение Inspiron »

Действительно просто и понятно. Меня смущало то, что strcmp будет сильно грузить МК, я думал может какие то другие функции сравнения есть, но попробую реализовать на этом.
Уважаемые модераторы, сделайте пожалуйста раздел дискотечных примочек и цветомузыки. Уже много тем пылятся в бездне ветки "Умные мысли"
Аватара пользователя
Fasterpast
Мучитель микросхем
Сообщения: 493
Зарегистрирован: Ср фев 14, 2007 12:07:58
Откуда: Москва
Контактная информация:

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

Сообщение Fasterpast »

Если посмотреть код который получается при strcmp, можно увидеть, что в итоге код получается не сильно тяжелее, чем если писать побайтовое сравнение ручками...
Аватара пользователя
foxit
Грызет канифоль
Сообщения: 262
Зарегистрирован: Пт ноя 16, 2007 00:40:17
Откуда: Украина

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

Сообщение foxit »

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

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

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


А есть пример?
Аватара пользователя
Alex_EXE
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Сб дек 27, 2008 12:01:35
Откуда: Россия, Екатеринбург
Контактная информация:

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

Сообщение Alex_EXE »

Еще можно посчитать контрольную сумму (например crc8 или хитрым образом сложить все байты) и уже контрольную сумму в switch пихать.
Ответить

Вернуться в «Интеграция с ПК»