|
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
|
|
Вопросы по работе UART через HAL.18.10.2016, 11:19. Показов 22580. Ответов 47
Метки нет (Все метки)
HAL_UART_Receive_IT(&huart1,&test[0],100);
HAL_UART_Transmit_IT(&huart1,&test1[0],100); HAL_UART_Receive_DMA(&huart1,&test[0],100); HAL_UART_Transmit_DMA(&huart1,&test1[0],100); Вопросы по этим функциям. 1. Прерывание длится пока не будет получен весь массив или только один байт ? (решено, прерывание вызывается пока не будет получен весь массив, потом необходимо вызывать инициализировать заново) 1.1 Аналогично для режима DMA. 1.2 В режиме DMA можно включить кольцевой массив. Тогда достаточно инициализировать 1 раз, и данные всегда будут поступать в буфер. 2. Почему при приёме каждое новое слово дописывается в массив, а не перезаписывает его с 1 элемента ? (решено, см п 2.1) 2.1 Или это потому что слово меньше 100 байт, и пока он не получит все 100 байт он будет считать это продолжением передачи (решено, так и есть) 3. Для простой передачи данных во внешнее устройство правильнее использовать HAL_UART_Transmit_DMA ? (решено, да правильнее снижается нагрузка на CPU + появляются дополнительные удобства в виде кольцевого буфера и возможности только раз запустить функцию, возможно есть и другие) 4. Динные полученные через DMA, не являются атомарными: 4.1 Для прерываний ?(решено, атомарность 1 байт) 4.2 Для основной программы ?(решено, атомарность 1 байт) 5. Динные полученные через IT, не являются атомарными: 5.1 Для прерываний ? (решено, атомарность 1 байт) 5.2 Для основной программы ? (решено, атомарность 1 байт)
0
|
|
| 18.10.2016, 11:19 | |
|
Ответы с готовыми решениями:
47
STM32F103C8T6 HAL UART
Stm32f4 Uart Hal |
|
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
|
|
| 18.10.2016, 11:31 | |
|
Прежде всего скажу следующее ,не холивара ради! просто мнение... Так как сам пользую HAL.
функции по приему/передачи UART реализованы слегка коряво. Но это на мой взгляд. Работают они следующим образом - по умолчанию прерывание ЗАПРЕЩЕННО! При вызове ф-ции прерывание разрешается и пока счетчик не обнулится оно будет разрешено. И после этого опять запрется. именно поэтому вы будите получать байты в свой массив пока не будет получено то кол-во байт которое вы указали в параметрах. Почему мне это НЕ нравится? Дело в том что в большинстве моих задач я НЕ знаю когда мне придет запрос... А если я не вызову фци-ю приема то и не получу ничего.. Никогда..
0
|
|
|
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
|
||
| 18.10.2016, 11:51 | ||
0
|
||
|
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
|
||
| 18.10.2016, 12:23 | ||
На самом деле с приемом все проще... Если используется DMA, то организуйте циклический буфер и смотрите сколько пришло и сколько считали с него данных - кольцевой буфер. В библиотеке к 1-Wire я так и делал, можете посмотреть, там у меня все строки с комментариями.
0
|
||
|
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
|
||
| 18.10.2016, 12:27 | ||
То есть правильно понимаю, что у вас реализовано вне основного цикла программы ?
0
|
||
|
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
|
||
| 18.10.2016, 12:43 | ||
То есть правильно понимаю, что у вас реализовано вне основного цикла программы ? Да, правильно понимаете, я один раз вызываю функцию приема и контроллер сам принимает данные по мере из прихода, а я в удобное для меня время их считываю. Ссылку на библиотеку я кидал в Вашем прошлом вопросе https://forum.iosyitistromyss.... 62#p465062
0
|
||
|
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
|
||
| 18.10.2016, 13:00 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
|
|
| 18.10.2016, 13:15 | |
|
СОбственно уже на все ответили.
Можно в Callback приема UART написать свою логику приема с кольцевым буфером и всегда разрешенным прерыванием. Я б сделал так. В моих задачах DMA по приему всегда был избыточен так как в большинстве случаев пакеты были короткими и длинна их заранее не известна. Проще было складывать по байтно в кольцевой буфер в прерывании
0
|
|
|
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
|
|
| 18.10.2016, 14:11 | |
|
Кольцевой буфер реализовал.
Собственно сейчас возник вопрос, как понять что приём завершён. Как один из вариантов вижу таймаут. то есть если прошло слишком много времени между байтами то это новое слово. Или есть какие либо другие механизмы ?
0
|
|
|
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
|
||
| 18.10.2016, 14:12 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 19.09.2017
Сообщений: 31
|
||
| 18.10.2016, 14:40 | ||
Это уже ты сам при обработке кольцевого буфера должен знать что и когда должно прийти.... и как это обработать... это зависит от твоего протокола обмена.
0
|
||
|
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
|
||
| 18.10.2016, 14:49 | ||
это зависит от твоего протокола обмена. Нее, это не интересно. :) Это анализатор содержимого и не универсальное решение. Почти получилось реализовать через таймаут. Но проблема в прерывании, окончательная обработка осуществляется только при следующем байте. То есть передаю "hitto world" но что бы слово считалось законченным нужно передать что то ещё после него но с паузой. Хотя если подумать, то это более правильно, анализировать получаемые данные и ждать эскейп последовательности, а там сразу в прерывании формировать готовый для дальнейшей обработки результат.
0
|
||
|
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
|
|
| 18.10.2016, 14:55 | |
|
В F0 есть аппаратная поддержка modbus RTU и ASСII, прерывания по таймауту и по определенному символу.
В этой и других линейках есть прерывание по IDLE, это + DMA вот вам и решение. Но, при использовании калокуба все обрастает некислым геморроем, все аппаратные плюшки просто херятся ...
0
|
|
|
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
|
|
| 18.10.2016, 15:10 | |
|
В тех протоколах что я использовал были заложены стартовые символы например и контрольная сумма. Я ловил эти символы затем принимал пакет и считал КС. Если не сходилось значит не то принял(например пакет с середины) или просто битый пакет. Можно икать кнец строки если передаются строки.
0
|
|
|
hosh
|
|
| 18.10.2016, 16:11 | |
|
А в моем варианте пакеты идут со старт байтами и стоп байтами с частотой 120гц , так между двумя пачками ещё и отвечать надо ровненько... Пришлось допилить каловский обработчик добавлять в нем вызов USER_UART_Rx1Byte_Callback(huart, data); , разрешить прерывание по приему на постоянку __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); и теперь принимаю по байту, ловлю старт, сразу crc считаю, и по приему стоповой комбинации остается сравнить уже посчитаное crc с тем, что пришло , и если всё пучком то заряжаю таймер для своевременного ответа, ну и можно приступать к разгребанию пришедшего пакета...
|
|
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 886
|
|
| 18.10.2016, 16:22 | |
|
В чем проблема написать свой обработчик по приему ?
Без вызова обработчика HAL хоть с кольцом, хоть как.
0
|
|
|
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
|
||
| 18.10.2016, 17:08 | ||
0
|
||
|
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 162
|
|
| 18.10.2016, 17:09 | |
|
Подскажите по функциям.
HAL_UART_TxCpltCallback HAL_UART_RxCpltCallback и им подобным. Что они делают ? Где и как применяются.
0
|
|
|
0 / 0 / 0
Регистрация: 24.08.2009
Сообщений: 3
|
||
| 18.10.2016, 17:22 | ||
Вообще говоря Вам стоит разобраться как это все в HAL устроено и оптимизировать выкинув лишнее. Но надо учесть что Cube имеет свойство переписывать то что вы правили вне его операторных скобок.
0
|
||
|
1 / 1 / 0
Регистрация: 10.09.2015
Сообщений: 171
|
||
| 18.10.2016, 18:27 | ||
0
|
||
| 18.10.2016, 18:27 | |
|
Помогаю со студенческими работами здесь
20
STM32F407 + HAL + UART правильное использование HAL и UART HAL UART, прошу совет
STM32 HAL прийом даних из UART Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|