Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 13.11.2016, 14:28  
Ioann_II
Временная регистрация
 
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Ioann_II на пути к лучшему
По умолчанию 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.
Ioann_II вне форума  
Непрочитано 13.11.2016, 14:44  
NewWriter
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

К сожалению (вернее к счастью) я с HAL-ом не работаю. Попробовал его - он показался настолько жутким и запутанным, он умудряется простые вещи настолько запутать, что я плюнул на него ваапще, ибо "лучше день потерять, зато за час потом долететь".

Если хотите проверять принятие обеих символов, то при приеме первого стопового байта (0x0D) вы должны выставить предварительный флаг (что-то типа preflag = 1), но этот байт не записывать в строку, а когда будете принимать следующий байт, проверяете наличие этого флага и соответствие принятого байта, и если он = 0x0A, сбрасываете счетчик байтов в строке. Принятый байт так же никуда не записываете.

Сообщение от Ioann_II Посмотреть сообщение
завершающие символы другие (например '4' и '5'), то затирания не происходит
Это надо копать саму функцию хала. Наверняка в ней в качестве завершающих символов допускаются только ANSI-символы, коды которых начинаются с 0x30. Отправьте 0x34, 0x35.

Последний раз редактировалось NewWriter; 13.11.2016 в 14:52.
NewWriter вне форума  
Непрочитано 13.11.2016, 14:52  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,662
Сказал спасибо: 185
Сказали Спасибо 3,183 раз(а) в 2,063 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Ioann_II, выкинь ты этот хал. пипеец нах - прерываний даже нету)) уровень ардуины!!

Сообщение от Ioann_II Посмотреть сообщение
HAL предоставляет только функцию чтения определённого количества байт
я хз как оно там делается но у стм нет буфера на порте. она принимает 1 байт а следующий его уже затирает. заодно ставит флаг overrun.
дальше я даже думать не хочу.
разберись с регистрами и работай сним напрямую а не через этот кошмар.
уж чтото а с уартом у меня ваще никогда проблем не было. ну максимум что он или работает или нет - когда в запарке не настроишь функции порта в регистре аф
__________________
кагмаподэ магмаподэ
индюк вне форума  
Непрочитано 13.11.2016, 14:55  
Ioann_II
Временная регистрация
 
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Ioann_II на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Функцию этого HALа я вот как-раз и переписываю - т.к. она умеет читать с порта только посылки фиксированной длинны (а часто ли они бывают такие - у меня ни разу...)
Ioann_II вне форума  
Непрочитано 13.11.2016, 15:13  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,662
Сказал спасибо: 185
Сказали Спасибо 3,183 раз(а) в 2,063 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

чо там переписывать то???
весь прием занимает 2 строки

void USART1_IRQHandler(void)
{
USART1-›SR&=~USART_SR_RXNE;

rx[x] = USART1-›DR;
}
набираешь массив и потом парсишь его отдельно если надо
__________________
кагмаподэ магмаподэ
индюк вне форума  
Непрочитано 13.11.2016, 15:17  
Ioann_II
Временная регистрация
 
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Ioann_II на пути к лучшему
По умолчанию 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, возможно тут какие-то ньюансы возникают?
Ioann_II вне форума  
Непрочитано 13.11.2016, 15:23  
Ioann_II
Временная регистрация
 
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Ioann_II на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Суть всей обработки в том, чтобы в буфере прерывание формировало строку с 0 на конце и вызывало функцию обработки строки, когда строка уже готова.
Ioann_II вне форума  
Непрочитано 13.11.2016, 15:23  
индюк
Гуру портала
 
Аватар для индюк
 
Регистрация: 17.07.2010
Адрес: мурмурляндия
Сообщений: 10,662
Сказал спасибо: 185
Сказали Спасибо 3,183 раз(а) в 2,063 сообщении(ях)
индюк на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

ой мать....... какая же каша блин.
чес говоря я ничо не понял из этого и зачем это надо.
абсолютно все описанные проблемы - надуманные. просто неверный алгоритм задумки всей твоей.

что программа ваще делать то должна? что за устройства? чтоони делают?
__________________
кагмаподэ магмаподэ
индюк вне форума  
Непрочитано 13.11.2016, 15:31  
Ioann_II
Временная регистрация
 
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Ioann_II на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Предполагается читать строки с GPS Приёмника- это один UART. Второй общаться должен с GPRS модемом - для отправки данных в БД на сайт.
Потом ещё и 3-й понадобится, но это уже потом.
Сейчас пробую пока что на stm32f103c8. И пока что только один UART.

Ранее, делал когда на AVR, там прерывание от UART формировало такую строку и выставляло флаг наличия строки.

Какой Вы алгоритм считаете оптимальным?
Ioann_II вне форума  
Непрочитано 13.11.2016, 15:33  
Ioann_II
Временная регистрация
 
Регистрация: 30.05.2005
Сообщений: 53
Сказал спасибо: 1
Сказали Спасибо 15 раз(а) в 11 сообщении(ях)
Ioann_II на пути к лучшему
По умолчанию Re: stm32 HAL UART - не могу понять

Всегда делал для себя библиотечные функции, при необходимости подключал к проекту нужные файлы и просто их использовал. Тут тоже полагаю в каком-то таком ключе делать.
Ioann_II вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хочу собрать схемку, не могу понять что за транзисторы sobyninsk Электроника - это просто 10 27.09.2013 12:37
Помогите разобраться со схемой. я не могу понять что не так. sofist Источники питания и свет 17 15.11.2007 15:52
Ошибка ISP режима (ISP Mode Error) Не могу понять в чём дело zhan99999 Микроконтроллеры, АЦП, память и т.д 4 11.01.2007 02:21
[Решено] Всем эмбеддерам посвящается... Decan Отвлекитесь, эмбеддеры! 0 24.10.2005 14:43
Не могу понять про float в PicBasicPro Raushan Микроконтроллеры, АЦП, память и т.д 3 13.06.2005 13:57


Часовой пояс GMT +4, время: 20:16.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot