Может кто сталкивался с проблемой, хочу конфигурировать AVR микроконтроллер по UART. Но столкнулся с проблемой.
Предположим я хочу видеть обмен с мк вида
Я: CONFIG
МК: CONFIG>
Я:LINE 1
MK:CONFIG / LINE 1>
Я: ENABLE
МК: LINE 1 : ENABLE
Вся проблема в том, как со стороны МК распознать какая команда пришла и перейти к соответствующему участку программы? Может у кого есть наработки на С/С++ или кто знает где это искать.
Вложенными switch-ами, самый наверное простой и сердитый вариант.
Можно сделать сопоставление строке номера, а потом уже только один свитч. Объявить массив строк, в котором все возможные команды, и в цикле искать нужную. Но это медленно, зато код компактней будет.
Ну то что case'ами или метками это понятно. меня немного другое интересует, UART принимает поток символов, как из него вычленить команду? как сравнить ее с другой строкой (методами сравнивания строк из С++ или методом побайтного сравнивания в цикле?). Вообще не мог бы кто нибудь примерчик привести, как это делается.
Уважаемые модераторы, сделайте пожалуйста раздел дискотечных примочек и цветомузыки. Уже много тем пылятся в бездне ветки "Умные мысли"
Вам нужно сформировать что-то вроде пакета или фиксированной длины, или с указанием длины в начале, или ввести символы начала и конца. В этом пакете вы сможете передавать команды и значения. Команды можно передавать как текстом, но если их немного - лучше байтом или парой байтов, заодно и легче будет switch'ем обрабатывать такие команды.
Для начала можно просто сделать по числу:
Скажем если 00000001 - начало программы, если 00000010, то еще что-то.
Тогда оч просто:
Прерывание -> запись этого числа в переменную, goto, обнудение переменной и тд
Если команды должны быть посложнее, то нужно делать какой-то буфер.
Создаётся массив, по прерыванию каждый байт пишется в следующий элемент массива.
Цикл сравнивает каждый элемент пока не находит ключевой начальный символ, и дальше считывает всё остальное, а потом уже и строковые сравнение, и всё что захотите.
Не знаю, может есть более красивые методы, но я себе делал так, вроде работает )
А чего тут думать: С кейсами проще всего:
Пришел символ, мы отправляем его в верхний свитч, где он сравнивается с первыми символами всех команд в кейсах, если совпало-то мы внутри этого кейса ждем прихода второго символа, и отправляем его на внутренний свитч уже в данном кейсе. Ну где то так:
Inspiron писал(а):Ну то что case'ами или метками это понятно. меня немного другое интересует, UART принимает поток символов, как из него вычленить команду? как сравнить ее с другой строкой (методами сравнивания строк из С++ или методом побайтного сравнивания в цикле?). Вообще не мог бы кто нибудь примерчик привести, как это делается.
Можно решать вопрос на уровне организации протокола (т.е. использовать, паример, команды фиксированной, известной длины). Из методов С иногда удобно scanf() использовать (если ресурсы позволяют). Можно массив перебирать... Вариантов масса, в чем вопрос-то?
Inspiron писал(а):... UART принимает поток символов, как из него вычленить команду?...
тут только два метода
1) временной. опираясь на временные задержки детектить фрэймы.
2) детектить старт фрэйма из самого потока данных.
как правило применяют оба. основной и вспомогательный для отсева ошибок или ошибочных состояний.
для скорости дешифровки команд необходимо оперировать той разрядностью, которая поддерживается железом.
например: оперируем байтами => анализ(кэйсы) на уровне байтов.
оперируем на уровне слов(16 бит) => анализ на уровне слов.
и т.п.
для универсального алгоритма - тут уже прозвучало: перебор списка, при совпадении => переход.
что-то тут пошло не в ту степь, по-моему... какие фреймы, какие байты? проще надо быть, граждане, проще!
каждая строка в консоли завершается вводом ENTER. МК принимает в буфер все, пока не получит код \n - это знак конца введенной строки-команды. получив этот код, МК формирует строку для анализа, а затем при помощи strcmp в цикле сравнивает полученную строку со строками в своем массиве. нашел строку - переходит к выполнению соответствующей функции, не нашел - вывел сообщение об ошибке...
просто и понятно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Действительно просто и понятно. Меня смущало то, что strcmp будет сильно грузить МК, я думал может какие то другие функции сравнения есть, но попробую реализовать на этом.
Уважаемые модераторы, сделайте пожалуйста раздел дискотечных примочек и цветомузыки. Уже много тем пылятся в бездне ветки "Умные мысли"
Если посмотреть код который получается при strcmp, можно увидеть, что в итоге код получается не сильно тяжелее, чем если писать побайтовое сравнение ручками...
Inspiron писал(а):Может кто сталкивался с проблемой, хочу конфигурировать AVR микроконтроллер по UART. Но столкнулся с проблемой.
Предположим я хочу видеть обмен с мк вида
Я: CONFIG
МК: CONFIG>
Я:LINE 1
MK:CONFIG / LINE 1>
Я: ENABLE
МК: LINE 1 : ENABLE
Вся проблема в том, как со стороны МК распознать какая команда пришла и перейти к соответствующему участку программы? Может у кого есть наработки на С/С++ или кто знает где это искать.