stm32 HAL UART - не могу понять
13.11.2016, 14:28
|
|
|
Временная регистрация
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
stm32 HAL UART - не могу понять
Здравствуйте, в STM32 я начинающий, приходится просить помощи.
Суть вот в чём. Надо принимать из последовательного порта строки. Строки обычно заканчиваются парами 0x0d 0x0a и могут быть разной длины. Принимать хочется, естественно, в прерывании (хотя-бы). HAL предоставляет только функцию чтения определённого количества байт. Потому решил эту функцию переделать.
Алгоритм такой: если символ 0x0d или 0x0a, то вместо него пишется 0x00 и указатель перемещается на начало буфера. В общем как-бы просто.
Теперь ближе к проблеме: когда отлавливаю только один символ завершения строки - безразлично какой 0x0d или 0x0a формируется нормальная строка. Если-же делаю проверку на оба символа, то почему-то на момент обработки прерывания как-бы в строке уже пришли оба символа:
посылаю: 0x31 0x32 0x33 0x34 0x35 0x0d 0x0a
получаю: 0x00 0x32 0x33 0x34 0x35 0x00
т.е. получается, что к моменту вызова HAL_UART_RxCpltCallback(huart) - сам вызываю по приходу \r или \n
следующий символ (0x0a) уже затирает начало строки....
Возникает впечатление, что программа выполняется не совсем последовательно...
Явно, Гипертерминал посылает пару 0x0d 0x0a практически без паузы, в то время как остальные символы с паузой. Если я указываю завершающие символы другие (например '4' и '5'), то затирания не происходит.
Кто-нибудь может внести ясность.
Спасибо.
Последний раз редактировалось Ioann_II; 13.11.2016 в 14:51.
|
|
|
|
13.11.2016, 14:44
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
|
Re: stm32 HAL UART - не могу понять
К сожалению (вернее к счастью) я с HAL-ом не работаю. Попробовал его - он показался настолько жутким и запутанным, он умудряется простые вещи настолько запутать, что я плюнул на него ваапще, ибо "лучше день потерять, зато за час потом долететь".
Если хотите проверять принятие обеих символов, то при приеме первого стопового байта (0x0D) вы должны выставить предварительный флаг (что-то типа preflag = 1), но этот байт не записывать в строку, а когда будете принимать следующий байт, проверяете наличие этого флага и соответствие принятого байта, и если он = 0x0A, сбрасываете счетчик байтов в строке. Принятый байт так же никуда не записываете.
Сообщение от Ioann_II
|
|
завершающие символы другие (например '4' и '5'), то затирания не происходит
|
Это надо копать саму функцию хала. Наверняка в ней в качестве завершающих символов допускаются только ANSI-символы, коды которых начинаются с 0x30. Отправьте 0x34, 0x35.
Последний раз редактировалось NewWriter; 13.11.2016 в 14:52.
|
|
|
|
13.11.2016, 14:52
|
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,108
Сказал спасибо: 202
Сказали Спасибо 3,280 раз(а) в 2,147 сообщении(ях)
|
Re: stm32 HAL UART - не могу понять
Ioann_II, выкинь ты этот хал. пипеец нах - прерываний даже нету)) уровень ардуины!!
Сообщение от Ioann_II
|
|
HAL предоставляет только функцию чтения определённого количества байт
|
я хз как оно там делается но у стм нет буфера на порте. она принимает 1 байт а следующий его уже затирает. заодно ставит флаг overrun.
дальше я даже думать не хочу.
разберись с регистрами и работай сним напрямую а не через этот кошмар.
уж чтото а с уартом у меня ваще никогда проблем не было. ну максимум что он или работает или нет - когда в запарке не настроишь функции порта в регистре аф
__________________
кагмаподэ магмаподэ
|
|
|
|
13.11.2016, 14:55
|
|
|
Временная регистрация
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: stm32 HAL UART - не могу понять
Функцию этого HALа я вот как-раз и переписываю - т.к. она умеет читать с порта только посылки фиксированной длинны (а часто ли они бывают такие - у меня ни разу...)
|
|
|
|
13.11.2016, 15:13
|
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,108
Сказал спасибо: 202
Сказали Спасибо 3,280 раз(а) в 2,147 сообщении(ях)
|
Re: stm32 HAL UART - не могу понять
чо там переписывать то???
весь прием занимает 2 строки
void USART1_IRQHandler(void)
{
USART1-›SR&=~USART_SR_RXNE;
rx[x] = USART1-›DR;
}
набираешь массив и потом парсишь его отдельно если надо
__________________
кагмаподэ магмаподэ
|
|
|
|
13.11.2016, 15:17
|
|
|
Временная регистрация
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: stm32 HAL UART - не могу понять
Индюк,
выкинуть HAL (и куб тоже) идея привлекательная, но вот только пробовал вместо него задействовать библиотеки, предоставляемые Keil-ом (приспособился к нему), так там та-же жуть... И весят примерно как и от Куба...
Если делать только простые вещи, то можно делать пустой проект и всё там уже "ручками" писать, благо на AVR всё так и делал....
По сути: в прерывании (пусть его пока что Куб заготовку делает):
1. чтение символа с порта.
2. подмена кода 0x0d или 0x0a на 0x00.
3. запись в буфер с инкрементом указателя.
4. если код 0x00, то установка указателя на начало буфера и вызов функции типа Callback, которая прописывается в основной программе и занимается тем, что копирует содержимое буфера в другой буфер и отсылает его обратно в порт.
символы конца строки могу устанавливать сам.
тест 1:
символы конца строки: 0x34 и 0x35
отсылаю: 0x31 0x32 0x33 0x34 0x35 0x0d 0x0a
получаю: 0x31 0x32 0x33 0x00
Всё верно.
тест 2:
символы конца строки: 0x0d и 0x0a
отсылаю: 0x31 0x32 0x33 0x34 0x35 0x0d 0x0a
получаю: 0x00 0x32 0x33 0x34 0x35 0x00
Первый символ затёрт.
различие в том, что гипертерминал пару 0x0d 0x0a шлёт сразу (может быть без паузы). что-то читал про режимы типа idle, возможно тут какие-то ньюансы возникают?
|
|
|
|
13.11.2016, 15:23
|
|
|
Временная регистрация
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: stm32 HAL UART - не могу понять
Суть всей обработки в том, чтобы в буфере прерывание формировало строку с 0 на конце и вызывало функцию обработки строки, когда строка уже готова.
|
|
|
|
13.11.2016, 15:23
|
|
|
Гуру портала
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 11,108
Сказал спасибо: 202
Сказали Спасибо 3,280 раз(а) в 2,147 сообщении(ях)
|
Re: stm32 HAL UART - не могу понять
ой мать....... какая же каша блин.
чес говоря я ничо не понял из этого и зачем это надо.
абсолютно все описанные проблемы - надуманные. просто неверный алгоритм задумки всей твоей.
что программа ваще делать то должна? что за устройства? чтоони делают?
__________________
кагмаподэ магмаподэ
|
|
|
|
13.11.2016, 15:31
|
|
|
Временная регистрация
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: stm32 HAL UART - не могу понять
Предполагается читать строки с GPS Приёмника- это один UART. Второй общаться должен с GPRS модемом - для отправки данных в БД на сайт.
Потом ещё и 3-й понадобится, но это уже потом.
Сейчас пробую пока что на stm32f103c8. И пока что только один UART.
Ранее, делал когда на AVR, там прерывание от UART формировало такую строку и выставляло флаг наличия строки.
Какой Вы алгоритм считаете оптимальным?
|
|
|
|
13.11.2016, 15:33
|
|
|
Временная регистрация
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
|
Re: stm32 HAL UART - не могу понять
Всегда делал для себя библиотечные функции, при необходимости подключал к проекту нужные файлы и просто их использовал. Тут тоже полагаю в каком-то таком ключе делать.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:58.
|
|