Парсер команд на C для кофигурирования МК по UART
- Inspiron
- Встал на лапы
- Сообщения: 144
- Зарегистрирован: Сб мар 17, 2007 19:38:52
- Откуда: Североонежск\Питер
- Контактная информация:
Парсер команд на C для кофигурирования МК по UART
Может кто сталкивался с проблемой, хочу конфигурировать AVR микроконтроллер по UART. Но столкнулся с проблемой.
Предположим я хочу видеть обмен с мк вида
Я: CONFIG
МК: CONFIG>
Я:LINE 1
MK:CONFIG / LINE 1>
Я: ENABLE
МК: LINE 1 : ENABLE
Вся проблема в том, как со стороны МК распознать какая команда пришла и перейти к соответствующему участку программы? Может у кого есть наработки на С/С++ или кто знает где это искать.
Предположим я хочу видеть обмен с мк вида
Я: CONFIG
МК: CONFIG>
Я:LINE 1
MK:CONFIG / LINE 1>
Я: ENABLE
МК: LINE 1 : ENABLE
Вся проблема в том, как со стороны МК распознать какая команда пришла и перейти к соответствующему участку программы? Может у кого есть наработки на С/С++ или кто знает где это искать.
- Реклама
- Alex_EXE
- Вымогатель припоя
- Сообщения: 580
- Зарегистрирован: Сб дек 27, 2008 12:01:35
- Откуда: Россия, Екатеринбург
- Контактная информация:
Re: Парсер команд на C для кофигурирования МК по UART
Можно реализовать на метках (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
Ну то что case'ами или метками это понятно. меня немного другое интересует, UART принимает поток символов, как из него вычленить команду? как сравнить ее с другой строкой (методами сравнивания строк из С++ или методом побайтного сравнивания в цикле?). Вообще не мог бы кто нибудь примерчик привести, как это делается.
Уважаемые модераторы, сделайте пожалуйста раздел дискотечных примочек и цветомузыки. Уже много тем пылятся в бездне ветки "Умные мысли"
- Alex_EXE
- Вымогатель припоя
- Сообщения: 580
- Зарегистрирован: Сб дек 27, 2008 12:01:35
- Откуда: Россия, Екатеринбург
- Контактная информация:
Re: Парсер команд на C для кофигурирования МК по UART
Вам нужно сформировать что-то вроде пакета или фиксированной длины, или с указанием длины в начале, или ввести символы начала и конца. В этом пакете вы сможете передавать команды и значения. Команды можно передавать как текстом, но если их немного - лучше байтом или парой байтов, заодно и легче будет switch'ем обрабатывать такие команды.
- Реклама
- Fasterpast
- Мучитель микросхем
- Сообщения: 493
- Зарегистрирован: Ср фев 14, 2007 12:07:58
- Откуда: Москва
- Контактная информация:
Re: Парсер команд на C для кофигурирования МК по UART
Для начала можно просто сделать по числу:
Скажем если 00000001 - начало программы, если 00000010, то еще что-то.
Тогда оч просто:
Прерывание -> запись этого числа в переменную, goto, обнудение переменной и тд
Если команды должны быть посложнее, то нужно делать какой-то буфер.
Создаётся массив, по прерыванию каждый байт пишется в следующий элемент массива.
Цикл сравнивает каждый элемент пока не находит ключевой начальный символ, и дальше считывает всё остальное, а потом уже и строковые сравнение, и всё что захотите.
Не знаю, может есть более красивые методы, но я себе делал так, вроде работает )
Скажем если 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
Inspiron писал(а):Ну то что case'ами или метками это понятно. меня немного другое интересует, UART принимает поток символов, как из него вычленить команду? как сравнить ее с другой строкой (методами сравнивания строк из С++ или методом побайтного сравнивания в цикле?). Вообще не мог бы кто нибудь примерчик привести, как это делается.
Можно решать вопрос на уровне организации протокола (т.е. использовать, паример, команды фиксированной, известной длины). Из методов С иногда удобно scanf() использовать (если ресурсы позволяют). Можно массив перебирать... Вариантов масса, в чем вопрос-то?
Оптимизм х (Опыт + Знания) = const
Re: Парсер команд на C для кофигурирования МК по UART
Inspiron писал(а):... UART принимает поток символов, как из него вычленить команду?...
тут только два метода
1) временной. опираясь на временные задержки детектить фрэймы.
2) детектить старт фрэйма из самого потока данных.
как правило применяют оба. основной и вспомогательный для отсева ошибок или ошибочных состояний.
для скорости дешифровки команд необходимо оперировать той разрядностью, которая поддерживается железом.
например: оперируем байтами => анализ(кэйсы) на уровне байтов.
оперируем на уровне слов(16 бит) => анализ на уровне слов.
и т.п.
для универсального алгоритма - тут уже прозвучало: перебор списка, при совпадении => переход.
удачи вам
(круглый)
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Парсер команд на C для кофигурирования МК по UART
что-то тут пошло не в ту степь, по-моему... какие фреймы, какие байты? проще надо быть, граждане, проще!
каждая строка в консоли завершается вводом ENTER. МК принимает в буфер все, пока не получит код \n - это знак конца введенной строки-команды. получив этот код, МК формирует строку для анализа, а затем при помощи strcmp в цикле сравнивает полученную строку со строками в своем массиве. нашел строку - переходит к выполнению соответствующей функции, не нашел - вывел сообщение об ошибке...
просто и понятно.
каждая строка в консоли завершается вводом ENTER. МК принимает в буфер все, пока не получит код \n - это знак конца введенной строки-команды. получив этот код, МК формирует строку для анализа, а затем при помощи strcmp в цикле сравнивает полученную строку со строками в своем массиве. нашел строку - переходит к выполнению соответствующей функции, не нашел - вывел сообщение об ошибке...
просто и понятно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Inspiron
- Встал на лапы
- Сообщения: 144
- Зарегистрирован: Сб мар 17, 2007 19:38:52
- Откуда: Североонежск\Питер
- Контактная информация:
Re: Парсер команд на C для кофигурирования МК по UART
Действительно просто и понятно. Меня смущало то, что strcmp будет сильно грузить МК, я думал может какие то другие функции сравнения есть, но попробую реализовать на этом.
Уважаемые модераторы, сделайте пожалуйста раздел дискотечных примочек и цветомузыки. Уже много тем пылятся в бездне ветки "Умные мысли"
- Fasterpast
- Мучитель микросхем
- Сообщения: 493
- Зарегистрирован: Ср фев 14, 2007 12:07:58
- Откуда: Москва
- Контактная информация:
Re: Парсер команд на C для кофигурирования МК по UART
Если посмотреть код который получается при strcmp, можно увидеть, что в итоге код получается не сильно тяжелее, чем если писать побайтовое сравнение ручками...
Re: Парсер команд на 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
Еще можно посчитать контрольную сумму (например crc8 или хитрым образом сложить все байты) и уже контрольную сумму в switch пихать.


