Урок 17: Приём данных по USART

preview_player
Показать описание
Приём данных с помощью прерываний.

Яндекс-деньги: 410012533560895
Скачать исходники урока можно от сюда:
Рекомендации по теме
Комментарии
Автор

Подсказка для тех, кто изучает микроконтроллеры серии stm32f10x. Пин под Rx должен быть инициализирован не альтернативной функцией, а в режиме GPIO_Mode_IPU, поскольку альтернативная функция на вход конфигурируется как floating, pullup или pull-down (см. пункт 9.1.4 Reference manual)

_Noname_Anonymous_
Автор

Рад снова видеть продолжения уроков по STM32

Спасибо за хорошые туториалы!

romanl
Автор

You're tutorial is awesome. If I had founded your movies earlier i would save 2 months of my life.

nomen_omen
Автор

Не обязательно таким образом работать по приему. Все зависит от стратегии, а она в свою очередь от конкретной ситуации. Описанная вами ситуация только одна. Существует и другие. Например данные приходят пачками не фиксированного размера. Тут уже не желательно считывать по одному байту. Если в целях лежит максимальная разгрузка процессора, и размер пакетов от 32 и далее, то можно подойти по другому. Можно определить буфер среднего размера. Естественно по прерыванию его вычитываем, но к тому же вместе с этим(при запуске дма) запускаем таймер с прерыванием. И по таймеру проверяем есть ли в буфере хоть один байт, то останавливаем дма вычитываем или обрабатываем данные, а потом запускаем ДМА заново. Каким будет этот таймер тоже зависит от потребностей иногда время не так важно, можно проверять и через 100мс, а для цпу это целая вечность, а пока она идет дма будет собирать данные не нагружая проц. Ну а если нам важна своевременность данных, то там либо таймер и буфер уменьшать ну или в крайнем случае уже ДМАшить по одному.

sergbo
Автор

А как можно обрабатывать команды вида - LED1 ON?

woofer
Автор

Здравствуйте, можно ли использовать одновременно 2 usart? То есть один usart будет принимать данные, а второй отправлять их(на блютуз) или же может предложите решение получше?

shank
Автор

Доброе утро! Я подключил usart к rs232 на ноутбуке и передаю показания на stm. Включил watchdog. Когда я отключаю ноут, watchdog начинает постоянно ресетить stm. Видимо пока на функцию обработки usart не придут данные, stm не пропускает эту функцию дальше и watchdog переполняется. Вы не знаете, есть ли функция проверки подключения usart, что провода не висят в воздухе а именно подключены? А то можно задеть ногой кабель, и stm вместо того чтобы просто замолчать начнет постоянно перезагружаться.
Сделать бы условие: если usart не подключен, то выходим из функции, а если подключен то выполняем функцию.

АлексейСергиеня-фч
Автор

Здравствуйте Sappise !
Как записать данные из нашего буфера Recieve_buff[Recieve_R] в массив, например memory1[15], с присвоением ей адреса.

kiss
Автор

Sappise, подскажите пожалуйста! Посылаю с компьютера данные с помощью Labview в формате string. А в микроконтроллер хочу принимать integer (чтобы потом управлять светодиодами, если пришла 1 - горит красный, если 2 - зеленый, если 3 - синий). Как мне преобразовать данные, принимаемые функцией HAL_UART_Receive в integer?
Функция atoi в кейле не работает (
Есть какие-нибудь функции для преобразования стрингов и чаров в integer?

ВикторПетров-ъз
Автор

Добрый день! А вы бы не могли программу скинуть com port monitor. Почему то не получатся найти ее в интрнете.

anastassiyakondrasheva
Автор

Что то у меня не получается передать данные. Программа циклится на прерывании по входящим данным.

TheOmarsogratlinskiy
Автор

Здравствуйте, а как можно с вами связаться?

arsattacks
Автор

Все работает, замечательно.
А как получить доступ из main.c к переменной char buffer[]="I am DMA!"?

tpvin
Автор

Здравствуйте, Sappise! Разобрался с DMA, проблема действительно была в адаптере. Но по приему возникла другая проблема. Когда сообщение с компьютера приходит он контроллер это засекает и начинает обработку прерываний, но в буфере почему-то 0х00. Подскажите пожалуйста в чем может быть дело?
При этом сообщения с контроллера на ПК приходят исправно. Я добавил чтоб при 0 включались диоды, но даже когда в буфере 0х00 они не включаются, программа проскакивает все условия.

Дополнение: Похоже проблема опять с адаптером, но точно я не уверен. Сейчас использую штучку под названием SiLab CP2102.

АлександрЕрохин-фя
Автор

Помогите пожалуйста, немного не понимаю... Я так понял что прерывание по приёму срабатывает после каждого принятого байта..тогда как быть, если я принимаю текстовую строку. Допустим я принимаю char str[] = "ASRT+1"; Получается, что usart принимает сначала байт, который содержит символ А, затем байт с символом S и так далее. По ходу приёма я набиваю конечный буфер. Но я как бы должен не знать какой длинны придёт строка. Я не знаю каким символом она заканчивается. То вот как тогда мне принять решение о том, что я получил всё что передал источник?

supercelt
Автор

Можете ли вы сказать точное название вашей программы "COM port Monitor"? Я что-то не нашел такую же как у вас

РоманБелей-цэ
Автор

какая прогоамма для COM используется у вас?

Geo_Zoukkkkk
Автор

Привет, я пытаюсь найти рабочий пример USB CDC чтобы напрямую передавать данные через USB без дополнительных коннекторов через виртуальный COM port. 
Есть какие-либо идеи? 

sergeyostrikov
Автор

А как вывести результат приёма на дисплей?

ivanrusev