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

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

Сообщение Inspiron »

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

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

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

Сообщение Alex_EXE »

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

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

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

Сообщение Inspiron »

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

Сообщение Alex_EXE »

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

Сообщение Fasterpast »

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

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

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

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

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

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

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) );
Люблю Си...
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург

Сообщение Aheir »

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

Сообщение kolobok0 »

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

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

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

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

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

Сообщение ARV »

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

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

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

Сообщение Inspiron »

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

Сообщение Fasterpast »

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

Сообщение foxit »

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

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

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

Сообщение Alex_EXE »

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

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