класс для общения через юарт. Глянул пару пример в инете и попробовал скопипастить, но чёт вышло неочень. Проблема в том, что если слишком быстро слать данные по юарту то они видимо перекрывают друг друга, и в итоге в ESP приходит мусор (а она в ответ плюется).
Вопрос - при передаче данных по юарту нужно ставить какую-то задержку или это у меня где-то ошибка? Код если нужен тут и тут
На мой сонный и некомпитентный взгляд, кажется не очень правильным тупо в вайде слать данные. Если я туда куда надо смотрю. Надо смотреть не переполнен ли тх буфер
а в "в вайде" что значит
Есть ли понимание, как работает уарт на сях и аппаратно. Что за прерывания у него.
Вангую, что нужно заимпрувить. Расскажи что знаешь про уарт и как понимаешь его работу
Вот я правильно понимаю, что ты в тупую тут шлёшь херову тучу данных в вайле. А вот ниже закоменчено, что с задержкой работает. Эта задержка, наверное тебе позволяла освобождать буфер. Ты не проверяешь его
правильно, щас попробую поправить спасибо
попробуй вот это убрать из прерывания else __HAL_UART_DISABLE_IT(m_UartHandle, UART_IT_TXE); и вот это: __HAL_UART_ENABLE_IT(m_UartHandle, UART_IT_TXE); из WriteChar. Просто один раз включи прерывание и дальше делай что тебе нужно. В принципе, скорее всего, в этом и проблема.
не, проблема остается
1. Попробуй слать через DMA. 2. Убедись в корректности мониторинга TX Busy флажка.
добавь проверку на пустой буфер в прерывании. Данные корраптиться сами не могут=) Либо у тебя по каким-то ещё прерываниям выполняется код записи, либо ты где-то ещё их насильно пишешь в регистр.
А места эти таки убери, так делать нехорошо.
Потому что ты спорадически включаешь и выключаешь прерывание в разных местах без всякой синхронизации. Либо мьютексом развяжи(что дикий оверкилл), либо включи один раз и просто пиши в дата регистр да следи, чтобы данные уходили.
Писать второй HAL смысла нет=)
Или просто кормить дма, особенно если пакет фиксированной длинны
блин я код HAL глянул там и правда тоже самое
Это для тех, кто знает про дма и его режимы, тут же пока с интерраптами разобраться не удалось=)
+ с ДМА еще не работал
Дма вроде и не фиксированной можно кормить. И принимать можно дма и idle
Естественно. Только ещё плюсом куча проверок на все случаи жизни. В крайнем случае, можешь просто сам хэндлер вызвать вместо энэйбла/дисэйбла интеррапта после записи в вектор, он сам отработает по флагам.
Делал такое. Ничего особо сложного, в принципе. Только смысла мало=)
Ну довольно удобно только. Проц не занят
И, кстати, не увидел очистки флагов на выходе из прерывания. Ну и барьеров тоже нет.
Если большие пакеты конечно
В прерывании по dma всё равно шаманством проц занимается. На больших объёмах пакетов - да, выгодно. А мелкие, наверное, и смысла нет так обрабатывать.
Флаги последовательностью чтения из SR + DR должны очищаться
На мелкие и вообще ДМА использовать смысла нет.
Не во всех камнях так это работает. Лучше перебздеть=)
Обсуждают сегодня