Приём данных с помощью прерываний. Яндекс-деньги: 410012533560895 Специально для сайта amberclan.clan.su Скачать исходники урока можно от сюда: amberclan.clan.su/load/stm32/p...
Подсказка для тех, кто изучает микроконтроллеры серии stm32f10x. Пин под Rx должен быть инициализирован не альтернативной функцией, а в режиме GPIO_Mode_IPU, поскольку альтернативная функция на вход конфигурируется как floating, pullup или pull-down (см. пункт 9.1.4 Reference manual)
Не обязательно таким образом работать по приему. Все зависит от стратегии, а она в свою очередь от конкретной ситуации. Описанная вами ситуация только одна. Существует и другие. Например данные приходят пачками не фиксированного размера. Тут уже не желательно считывать по одному байту. Если в целях лежит максимальная разгрузка процессора, и размер пакетов от 32 и далее, то можно подойти по другому. Можно определить буфер среднего размера. Естественно по прерыванию его вычитываем, но к тому же вместе с этим(при запуске дма) запускаем таймер с прерыванием. И по таймеру проверяем есть ли в буфере хоть один байт, то останавливаем дма вычитываем или обрабатываем данные, а потом запускаем ДМА заново. Каким будет этот таймер тоже зависит от потребностей иногда время не так важно, можно проверять и через 100мс, а для цпу это целая вечность, а пока она идет дма будет собирать данные не нагружая проц. Ну а если нам важна своевременность данных, то там либо таймер и буфер уменьшать ну или в крайнем случае уже ДМАшить по одному.
Здравствуйте, можно ли использовать одновременно 2 usart? То есть один usart будет принимать данные, а второй отправлять их(на блютуз) или же может предложите решение получше?
Sappise, подскажите пожалуйста! Посылаю с компьютера данные с помощью Labview в формате string. А в микроконтроллер хочу принимать integer (чтобы потом управлять светодиодами, если пришла 1 - горит красный, если 2 - зеленый, если 3 - синий). Как мне преобразовать данные, принимаемые функцией HAL_UART_Receive в integer? Функция atoi в кейле не работает ( Есть какие-нибудь функции для преобразования стрингов и чаров в integer?
Здравствуйте, Sappise! Разобрался с DMA, проблема действительно была в адаптере. Но по приему возникла другая проблема. Когда сообщение с компьютера приходит он контроллер это засекает и начинает обработку прерываний, но в буфере почему-то 0х00. Подскажите пожалуйста в чем может быть дело? При этом сообщения с контроллера на ПК приходят исправно. Я добавил чтоб при 0 включались диоды, но даже когда в буфере 0х00 они не включаются, программа проскакивает все условия. Дополнение: Похоже проблема опять с адаптером, но точно я не уверен. Сейчас использую штучку под названием SiLab CP2102.
+Sappise Кажется разобрался! Смешная проблема, но я отправлял текст, а не цифру, как у Вас в ролике. А проверял работоспособность UART отправкой сообщения на компьютер при нажатии кнопки, и обрабатывал это в while похоже это вызывало какие-то проблемы. Все исправил, заработало, пока что... ) Спасибо вам, за урок.
Доброе утро! Я подключил usart к rs232 на ноутбуке и передаю показания на stm. Включил watchdog. Когда я отключаю ноут, watchdog начинает постоянно ресетить stm. Видимо пока на функцию обработки usart не придут данные, stm не пропускает эту функцию дальше и watchdog переполняется. Вы не знаете, есть ли функция проверки подключения usart, что провода не висят в воздухе а именно подключены? А то можно задеть ногой кабель, и stm вместо того чтобы просто замолчать начнет постоянно перезагружаться. Сделать бы условие: если usart не подключен, то выходим из функции, а если подключен то выполняем функцию.
Как вариант терминал в CAVR (среда под AVR) да во многих средах программирования есть терминалы для работы с USART Да вроде толза от ST есть с терминалом Ну или Delphi..... :)
Помогите пожалуйста, немного не понимаю... Я так понял что прерывание по приёму срабатывает после каждого принятого байта..тогда как быть, если я принимаю текстовую строку. Допустим я принимаю char str[] = "ASRT+1"; Получается, что usart принимает сначала байт, который содержит символ А, затем байт с символом S и так далее. По ходу приёма я набиваю конечный буфер. Но я как бы должен не знать какой длинны придёт строка. Я не знаю каким символом она заканчивается. То вот как тогда мне принять решение о том, что я получил всё что передал источник?
Вообще строка заканчивается по достижению нуль терминатора. Или можно использовать стандартное сочетание двух байт EOF [0x00;0xff]. Да и строку можно завершать стандартными байтами 0x10;0x13. Да и насколько я помню строки на аппаратном уровне передают задом наперёд в этом случае нуль терминатор идёт первым сообщая что дальше будет строка и здесь её конец. Затем строка в обратном порядке и снова нуль терминатор (начало). Либо нуль терминатор затем длина строки в байтах и строка.
Привет, я пытаюсь найти рабочий пример USB CDC чтобы напрямую передавать данные через USB без дополнительных коннекторов через виртуальный COM port. Есть какие-либо идеи?
Sappise Спасибо за ответ. С extern у меня ругается .\Bin\Arburg.axf: Error: L6218E: Undefined symbol bufferDMAUSARTSend (referred from mcu_ini.o). Попробую, сделать функцию на заполнение этого массива. Делаю на отправку данных. Если можно, еще пару вопросов. 1. Как я понял при программировании используется язык C, можете порекомендовать книгу по нему? Чтобы я не задавал глупых вопросов:). 2. Проблема в получении данных, через USART по DMA, лишь в том, что не известно сколько байт придет. Но если система обменивается стандартными пакетами известной длины, то можно задействовать DMA?
Tp Vin с экстерн, у вас явно что-то не подключено. Должно работать. Книжку я спрошу у специалиста :-) Сам учил по методу: "Яндекс, как мне сделать (что требуется сделать)". Ну или коллег допрашивал. Если вы чётко знаете сколько байт вам придёт, то ДМА очень даже подойдёт.
Sappise >> с экстерн, у вас явно что-то не подключено. Должно работать. Буду искать, проект перебрал и сделал новый, под свои нужды. Ну мы все так ищем:), но у меня проект огромный, поэтому мне придется учить. Еще раз большое спасибо!
+Sappise Спасибо. А можете подсказать, как с помощью функции scanf принять данные с recieve_buf и передать переменным, чтобы в дальнейшем их испольозовать.
вот напрмер шлю какой то код (1234567). Мне нужно указать что 1-это переменная a, 2-это переменная b,..... 567-переменная d. И я могу слать другую комбинацию цифр или символов, но прога должна понимать, что 1-е значение это переменная a, 2-е значение это переменная b и тд. Вот типо такого
@@ivanrusev2270 Подключаете дисплей, как рассказано в другом уроке. Полученное значение переводите в строку функцией, к примеру, atoi и отправляете на дисплей.