Добрый вечер. Программирование на МК начал только изучать. Задался вопрос передать с программы на ПК строку в МК, и в условии на МК уже сравнивать и выполнять те или иные действия. Как передать один байт с ПК на МК я разобрался, а вот как быть со строкой? Если там скажем в команде по пять символов? В принципе алгоритм понятен, но реализовать что то пока не могу. Пишу на Atmel Studio 7 Может кто чем поможет? Или на примере покажет?
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4565 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
LEX38RUS писал(а):
Как передать один байт с ПК на МК я разобрался, а вот как быть со строкой?
Дак строка - это n-ное кол-во байтов. Если один байт можете передать, почему не можете несколько ? Если честно, не понятно, что Вам непонятно. Поподробнее... И с кусками кода...
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Код слизан. Но принцип работы я понимаю кода. Ну и соответственно проверка, если пришел символ 1 то зажигаем диод если 2 то гасим. С этим все понятно и можно работать так в принципе, но охота до ума довести и сделать как отправку команд, допустим с ПК отправляю On и диод зажигаем, отправляю Off диод гасим. Вот и не могу докубатурить как организовать так чтоб принял байты, закончил прием, сложил их и можно было сравнить потом со строкой скажем так if(buffer == "On"{зажигаем диод} Вообщем с передачей и проверкой по одному байту проблем нет, а вот принять строку и проверить ее в условии проблема есть. За ранее благодарю.
В нём и заполняйте массив. А окончание приёма строки будет по нулевому байту. Сначала добейтесь полноценного приёма строки, а парсинг - дело второстепенное, займётесь им потом.
Допустим записал я в масив байты. Кпк мне далее этот масив сравнить с текстом? Через sprintf? К примеру имеем массив buffer_byt и его нужно сравнить с текстом скажем "ON"
Напрямую работать со строками в микроконтроллере нельзя. По крайней мере на С и асм. Строка это в любом случае массив, наполненный символами. Если так хочется писать on и off, то я бы сделал так. В цикле for читаем строку, допустим до нулевого символа и затем сравниваем с эталонными значениями других массивов (на самом деле я бы даже взял второй элемент массива и сравнил его с символом 'f' или 'n', это если не использовать защит от неправильно введенных символов). И в зависимости от полученного значения устанавливать флаг, от которого и будет зависеть дальнейший алгоритм действий. Могу в чем то ошибаться, так как сам далеко не большой специалист в программировании.
В планах было сделать так, что если отправлена команда с ПК и содержит первый символ # то начинаем писать последующие принятые байты в массив и по принятию скажем последнего какого нибудь символа заканчиваем писать и принимать данные. Подобный пример находил в инете. Но не то. Для меня остаётся не понятным как мне сравнить данные которые записаны в массиве с другой строкой.
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Аlex писал(а):
В нём и заполняйте массив. А окончание приёма строки будет по нулевому байту.
Только не по нулю. Если набор идет с терминала, признаком окончания строки, обычно, служит символ <CR> (0x0D). А еще нужно решить вопрос с эхом - правильной реализацией будет пользовать терминал в режиме "без эха", а эхо делать самому, передавая каждый полученный символ назад. Получив <CR>, нужно занести в буфер строки нулевой байт, как признак конца этой строки, а "эхом" вернуть символы <CR>,<LF> (0x0D, 0x0A), после чего отметить основной программе, что строка получена. Ну, и не забыть, получая каждый байт, контролировать буфер строки на переполнение.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
В нём и заполняйте массив. А окончание приёма строки будет по нулевому байту.
Только не по нулю. Если набор идет с терминала, признаком окончания строки, обычно, служит символ <CR> (0x0D). А еще нужно решить вопрос с эхом - правильной реализацией будет пользовать терминал в режиме "без эха", а эхо делать самому, передавая каждый полученный символ назад. Получив <CR>, нужно занести в буфер строки нулевой байт, как признак конца этой строки, а "эхом" вернуть символы <CR>,<LF> (0x0D, 0x0A), после чего отметить основной программе, что строка получена. Ну, и не забыть, получая каждый байт, контролировать буфер строки на переполнение.
Это уже тонкости, на мой взгляд. Насколько я понял, человек не может понять как сравнить полученный массив со строкой с эталонной строкой.
существуют же стадартные функции для работы со строками! scanf - прием строки strcmp - сравнение строк есть и другие с разными нюансами - почему бы не пользоваться ими? почему начинающему всегда стремятся дать советы, как сделать посложнее?
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Существуют. Лично я экономлю память МК. Как Flash так и SRAM. При подключении стандартных библиотек пару килобайт flash, а то и больше, сразу можно списывать. Не говоря уж о SRAM. Пы Сы Я же написал, "пример". Дальше дело ТС, что он будет делать. Использовать примеры или стандартные библиотеки.
очему начинающему всегда стремятся дать советы, как сделать посложнее?
Мне, как начинающему, проще работать не со стандартными функциями (о которых я собственно и не знал , а тем более знающие люди говорят, что памяти сжирают много ), а со своими. По крайней мере в данном случае можно ознакомиться с оператором for, массивами, ну и большом желании, с указателями..
Мне, как начинающему, проще работать не со стандартными функциями (о которых я собственно и не знал
т.е. изобретение велосипеда - это, по-вашему, проще? пока все едут, вы изобретаете, так? я понимаю случай, когда программист собаку съел на алгоритмах и способен конкурировать со стандартными функциями, решая задачи оптимизации и т.п. но когда начинающий, еще не сделавший сортировку пузырьком ни разу, вдруг решает, что самописные функции будут лучше - это, имхо, нонсенс.
понимать, как работает сравнение строк - да, необходимо. писать это самому - нет, не всегда.
Demiurg писал(а):
Лично я экономлю память МК. Как Flash так и SRAM. При подключении стандартных библиотек пару килобайт flash, а то и больше, сразу можно списывать.
не скажу, что это голословное утверждение, но сильно-сильно сомневаюсь в его истинности. расход памяти, конечно, имеет место быть, но ведь и самописная реализация какой-то функции потребует расходов... и не факт, что получится без ошибок.
Demiurg писал(а):
Дальше дело ТС, что он будет делать
начинающего вести за ручку надо до тех пор, пока он не обретет опыт и станет способен самостоятельно принимать такие решения. даже для меня нет однозначного выбора между самописным вариантом приема строки из UART и scanf - я буду думать долго, а что взять с начинающего?
но учиться (и учить) все-таки лучше от простого к сложному, от готового к нестандартному. avr-libc должна быть основой, настольной книгой, и только суровая действительность может быть основанием отказаться от нее.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
//================== void _Print_Buf (u08 x, char __flash *data) { for (u08 i = 0; data [i] != 0;) { dsp_buf [x++] = data [i++]; } } //==================
Print_Buf (2, 12, "Ваш текст");
Я работаю с символьными дисплеями так: создается буфер размером MAX_X*MAX_Y. Дисплей работает только на запись, чтения нет. Раз в 1 мс посимвольно отправляется содержимое буфера дисплея. Полное обновление дисплея происходит за MAX_X*MAX_Y + кол-во адресов строк. При дисплее 20х4 за 84 мс. Это сделано из-за того, что если на дисплей долго что-то не отправлять, на дисплее появляются кракозябры, которые появляются из-за помех.
Сравните на досуге, сколько памяти займет мой способ и с применением стандартных библиотек.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения