Тёмный

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

Sappise
Подписаться 12 тыс.
Просмотров 15 тыс.
50% 1

Приём данных с помощью прерываний.
Яндекс-деньги: 410012533560895
Специально для сайта amberclan.clan.su
Скачать исходники урока можно от сюда:
amberclan.clan.su/load/stm32/p...

Наука

Опубликовано:

 

20 янв 2014

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 58   
@_Noname_Anonymous_
@_Noname_Anonymous_ 8 лет назад
Подсказка для тех, кто изучает микроконтроллеры серии stm32f10x. Пин под Rx должен быть инициализирован не альтернативной функцией, а в режиме GPIO_Mode_IPU, поскольку альтернативная функция на вход конфигурируется как floating, pullup или pull-down (см. пункт 9.1.4 Reference manual)
@romanl1234
@romanl1234 10 лет назад
Рад снова видеть продолжения уроков по STM32 Спасибо за хорошые туториалы!
@Sappise
@Sappise 10 лет назад
Вообщем-то я этими видео просто иллюстрирую свой курс. Я думаю с такими видео будет проще выполнить лабораторные и курсовые проекты.
@nomen_omen
@nomen_omen 10 лет назад
You're tutorial is awesome. If I had founded your movies earlier i would save 2 months of my life.
@sergbo3114
@sergbo3114 4 года назад
Не обязательно таким образом работать по приему. Все зависит от стратегии, а она в свою очередь от конкретной ситуации. Описанная вами ситуация только одна. Существует и другие. Например данные приходят пачками не фиксированного размера. Тут уже не желательно считывать по одному байту. Если в целях лежит максимальная разгрузка процессора, и размер пакетов от 32 и далее, то можно подойти по другому. Можно определить буфер среднего размера. Естественно по прерыванию его вычитываем, но к тому же вместе с этим(при запуске дма) запускаем таймер с прерыванием. И по таймеру проверяем есть ли в буфере хоть один байт, то останавливаем дма вычитываем или обрабатываем данные, а потом запускаем ДМА заново. Каким будет этот таймер тоже зависит от потребностей иногда время не так важно, можно проверять и через 100мс, а для цпу это целая вечность, а пока она идет дма будет собирать данные не нагружая проц. Ну а если нам важна своевременность данных, то там либо таймер и буфер уменьшать ну или в крайнем случае уже ДМАшить по одному.
@shank923
@shank923 7 лет назад
Здравствуйте, можно ли использовать одновременно 2 usart? То есть один usart будет принимать данные, а второй отправлять их(на блютуз) или же может предложите решение получше?
@arsattacks6531
@arsattacks6531 9 лет назад
Здравствуйте, а как можно с вами связаться?
@user-xb1hu5kk7t
@user-xb1hu5kk7t 5 лет назад
Sappise, подскажите пожалуйста! Посылаю с компьютера данные с помощью Labview в формате string. А в микроконтроллер хочу принимать integer (чтобы потом управлять светодиодами, если пришла 1 - горит красный, если 2 - зеленый, если 3 - синий). Как мне преобразовать данные, принимаемые функцией HAL_UART_Receive в integer? Функция atoi в кейле не работает ( Есть какие-нибудь функции для преобразования стрингов и чаров в integer?
@Sappise
@Sappise 5 лет назад
Можно как-то так. Где А[i] входные данные. B - Итоговое число. i=0; B=0; while ((A[i] > 0x2F) && (A[i] < 0x3A)) { B *=10; B += A[i++]-0x30. }
@user-xb1hu5kk7t
@user-xb1hu5kk7t 5 лет назад
ура!!! Спасибо!
@user-kh2jq6qk7d
@user-kh2jq6qk7d 8 лет назад
Здравствуйте, Sappise! Разобрался с DMA, проблема действительно была в адаптере. Но по приему возникла другая проблема. Когда сообщение с компьютера приходит он контроллер это засекает и начинает обработку прерываний, но в буфере почему-то 0х00. Подскажите пожалуйста в чем может быть дело? При этом сообщения с контроллера на ПК приходят исправно. Я добавил чтоб при 0 включались диоды, но даже когда в буфере 0х00 они не включаются, программа проскакивает все условия. Дополнение: Похоже проблема опять с адаптером, но точно я не уверен. Сейчас использую штучку под названием SiLab CP2102.
@Sappise
@Sappise 8 лет назад
+Александр Ерохин Вы принимаете по прерываниям или по ДМА? Если второе, то перепишите на прерывания. Проверьте оптимизацию. Выключите её.
@user-kh2jq6qk7d
@user-kh2jq6qk7d 8 лет назад
+Sappise По прерываниям USART. Использую USART3.
@user-kh2jq6qk7d
@user-kh2jq6qk7d 8 лет назад
+Sappise Кажется разобрался! Смешная проблема, но я отправлял текст, а не цифру, как у Вас в ролике. А проверял работоспособность UART отправкой сообщения на компьютер при нажатии кнопки, и обрабатывал это в while похоже это вызывало какие-то проблемы. Все исправил, заработало, пока что... ) Спасибо вам, за урок.
@user-dv6tz1ui8k
@user-dv6tz1ui8k 5 лет назад
Доброе утро! Я подключил usart к rs232 на ноутбуке и передаю показания на stm. Включил watchdog. Когда я отключаю ноут, watchdog начинает постоянно ресетить stm. Видимо пока на функцию обработки usart не придут данные, stm не пропускает эту функцию дальше и watchdog переполняется. Вы не знаете, есть ли функция проверки подключения usart, что провода не висят в воздухе а именно подключены? А то можно задеть ногой кабель, и stm вместо того чтобы просто замолчать начнет постоянно перезагружаться. Сделать бы условие: если usart не подключен, то выходим из функции, а если подключен то выполняем функцию.
@Sappise
@Sappise 5 лет назад
На ножке RX должна быть 1, если подключено. Можете проверять её. Но лучше отправлять ответ. Не получили, значит не подключено.
@kiss6843
@kiss6843 8 лет назад
Здравствуйте Sappise ! Как записать данные из нашего буфера Recieve_buff[Recieve_R] в массив, например memory1[15], с присвоением ей адреса.
@Sappise
@Sappise 8 лет назад
+Алексей Кисель memcpy не подходит?
@kiss6843
@kiss6843 8 лет назад
Sappise Я про нее не знаю, будьте так добры, можете подсказать в каком уроке есть пример.
@Sappise
@Sappise 8 лет назад
+Алексей Кисель Я в уроках этой функцией не пользовался.
@user-yd6lq3qp3p
@user-yd6lq3qp3p 9 лет назад
Можете ли вы сказать точное название вашей программы "COM port Monitor"? Я что-то не нашел такую же как у вас
@Sappise
@Sappise 9 лет назад
ComMon. Насколько стоит её выкладывать я не знаю, т.к. это не моя программа.
@alinz8929
@alinz8929 9 лет назад
Как вариант терминал в CAVR (среда под AVR) да во многих средах программирования есть терминалы для работы с USART Да вроде толза от ST есть с терминалом Ну или Delphi..... :)
@user-xu5nk7fo6b
@user-xu5nk7fo6b 7 лет назад
какая прогоамма для COM используется у вас?
@Sappise
@Sappise 7 лет назад
ComMon.
@woofer466
@woofer466 9 лет назад
А как можно обрабатывать команды вида - LED1 ON?
@supercelt3
@supercelt3 7 лет назад
Помогите пожалуйста, немного не понимаю... Я так понял что прерывание по приёму срабатывает после каждого принятого байта..тогда как быть, если я принимаю текстовую строку. Допустим я принимаю char str[] = "ASRT+1"; Получается, что usart принимает сначала байт, который содержит символ А, затем байт с символом S и так далее. По ходу приёма я набиваю конечный буфер. Но я как бы должен не знать какой длинны придёт строка. Я не знаю каким символом она заканчивается. То вот как тогда мне принять решение о том, что я получил всё что передал источник?
@Sappise
@Sappise 7 лет назад
Принять решение по таймауту. Больше ничего не приходит - значит всё пришло.
@_dzen_tv_
@_dzen_tv_ 7 лет назад
Вообще строка заканчивается по достижению нуль терминатора. Или можно использовать стандартное сочетание двух байт EOF [0x00;0xff]. Да и строку можно завершать стандартными байтами 0x10;0x13. Да и насколько я помню строки на аппаратном уровне передают задом наперёд в этом случае нуль терминатор идёт первым сообщая что дальше будет строка и здесь её конец. Затем строка в обратном порядке и снова нуль терминатор (начало). Либо нуль терминатор затем длина строки в байтах и строка.
@sergeyostrikov356
@sergeyostrikov356 10 лет назад
Привет, я пытаюсь найти рабочий пример USB CDC чтобы напрямую передавать данные через USB без дополнительных коннекторов через виртуальный COM port. Есть какие-либо идеи?
@Sappise
@Sappise 10 лет назад
В интернете есть статья на русском про организацию VCP на USB. Будет время сброшу ссылку.
@tpvin9692
@tpvin9692 9 лет назад
Все работает, замечательно. А как получить доступ из main.c к переменной char buffer[]="I am DMA!"?
@Sappise
@Sappise 9 лет назад
2 варианта. использовать строку: extern char buffer[] или написать функцию, возвращающие элемент этого буфера.
@tpvin9692
@tpvin9692 9 лет назад
Sappise Спасибо за ответ. С extern у меня ругается .\Bin\Arburg.axf: Error: L6218E: Undefined symbol bufferDMAUSARTSend (referred from mcu_ini.o). Попробую, сделать функцию на заполнение этого массива. Делаю на отправку данных. Если можно, еще пару вопросов. 1. Как я понял при программировании используется язык C, можете порекомендовать книгу по нему? Чтобы я не задавал глупых вопросов:). 2. Проблема в получении данных, через USART по DMA, лишь в том, что не известно сколько байт придет. Но если система обменивается стандартными пакетами известной длины, то можно задействовать DMA?
@Sappise
@Sappise 9 лет назад
Tp Vin с экстерн, у вас явно что-то не подключено. Должно работать. Книжку я спрошу у специалиста :-) Сам учил по методу: "Яндекс, как мне сделать (что требуется сделать)". Ну или коллег допрашивал. Если вы чётко знаете сколько байт вам придёт, то ДМА очень даже подойдёт.
@tpvin9692
@tpvin9692 9 лет назад
Sappise >> с экстерн, у вас явно что-то не подключено. Должно работать. Буду искать, проект перебрал и сделал новый, под свои нужды. Ну мы все так ищем:), но у меня проект огромный, поэтому мне придется учить. Еще раз большое спасибо!
@anastassiyakondrasheva7600
@anastassiyakondrasheva7600 8 лет назад
Добрый день! А вы бы не могли программу скинуть com port monitor. Почему то не получатся найти ее в интрнете.
@Sappise
@Sappise 8 лет назад
+Anastassiya Kondrasheva amberclan.clan.su/load/stm32/common/3-1-0-52#
@anastassiyakondrasheva7600
@anastassiyakondrasheva7600 8 лет назад
+Sappise Спасибо. А можете подсказать, как с помощью функции scanf принять данные с recieve_buf и передать переменным, чтобы в дальнейшем их испольозовать.
@Sappise
@Sappise 8 лет назад
+Anastassiya Kondrasheva Зачем? Считывайте из буфера напрямую. есть ещё функция memcpy.
@anastassiyakondrasheva7600
@anastassiyakondrasheva7600 8 лет назад
вот напрмер шлю какой то код (1234567). Мне нужно указать что 1-это переменная a, 2-это переменная b,..... 567-переменная d. И я могу слать другую комбинацию цифр или символов, но прога должна понимать, что 1-е значение это переменная a, 2-е значение это переменная b и тд. Вот типо такого
@Sappise
@Sappise 8 лет назад
+Anastassiya Kondrasheva 1234567 - это строка или значения оправляемых байт?
@TheOmarsogratlinskiy
@TheOmarsogratlinskiy 10 лет назад
Что то у меня не получается передать данные. Программа циклится на прерывании по входящим данным.
@Sappise
@Sappise 10 лет назад
Скачайте с моего сайта примеры и попробуйте запустить их.
@TheOmarsogratlinskiy
@TheOmarsogratlinskiy 10 лет назад
Sappise Ссылку будьте добры. а то никак не найду
@Sappise
@Sappise 10 лет назад
Омар Омаров amberclan.clan.su/load/stm32/primery_raboty_s_stm32f4_discovery/3-1-0-47
@ivanrusev2270
@ivanrusev2270 2 года назад
А как вывести результат приёма на дисплей?
@Sappise
@Sappise 2 года назад
Используйте любую программу для получения данных с ком порта.
@ivanrusev2270
@ivanrusev2270 2 года назад
@@Sappise Вы меня не поняли.Если я передаю с одного usart1 а usart2 принимает.То каким образом я это могу отобразить на LCD?
@Sappise
@Sappise 2 года назад
@@ivanrusev2270 Подключаете дисплей, как рассказано в другом уроке. Полученное значение переводите в строку функцией, к примеру, atoi и отправляете на дисплей.
@ivanrusev2270
@ivanrusev2270 2 года назад
@@Sappise Пожалуста дайте ссылку на этот урок
@Sappise
@Sappise 2 года назад
@@ivanrusev2270 ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-dMWF6zGHD1I.html
Далее
Урок 18 Память теория
9:58
Просмотров 10 тыс.
Проверил на логику певца L’one
00:17