Можно ли установить таймаут для приема данных через USB в микроконтроллерах STM32? - PullRequest
0 голосов
/ 30 июня 2019

Мне интересно, возможно ли установить тайм-аут для получения данных через интерфейс USB в микроконтроллерах STM32.Такой подход возможен, например, в соединении UART (см. AN3109, раздел 2. Тайм-аут приема DMA).

Я не могу найти ничего подобного, связанного с интерфейсом USB.Более того, говорят, что DMA для USB должен быть включен, только если это действительно необходимо, потому что передача данных должна быть выровнена по 32-битному слову.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

В случае UART вы обращаетесь либо к тайм-ауту приема DMA, как вы сказали, либо (если не используется DMA) прерывание IDLE.Я не знаю, что такое происходит «из коробки» для USB CDC - вы должны реализовать это время самостоятельно, что не должно быть слишком сложным.Имейте таймер (аппаратное обеспечение программного обеспечения), который вы повторно запускаете каждый раз, когда вы получаете данные.Установите для его периода значение тайм-аута по вашему выбору и выполните синтаксический анализ протокола по истечении времени ожидания.

Если бы мне пришлось что-то добавить - такого рода проблемы (не зная, сколько байтов нужно получить), как правило, решаются в протоколе.уровень.Предполагая двоичный протокол, одним из способов достижения этого является наличие байтов начала и конца кадра, которые никогда не встречаются в данных (и если они это делают - вы избегаете их), и в этом случае вы получаете все, начиная с «начального байта», пока не получите «конечный байт»,Еще один способ состоит в том, чтобы иметь «стартовый байт» и поле, указывающее, сколько байтов нужно получить.Все это, конечно, должно быть проверено каким-то образом.

Сказав, что, если у вас есть возможность изменить протокол, вы действительно должны это сделать.Полагаясь на тайминги в вашем общении, особенно на таком низком уровне, только в долгосрочной перспективе возникают проблемы и головные боли.Вы вводите тесную связь между вашим уровнем протокола и уровнем интерфейса.Это будет иметь неприятные последствия для вас каждый раз, когда вы решите использовать другой интерфейс, так как вам придется заново изобретать ту же вещь.Не говоря уже о том, как больно будет, когда вы решите перейти на TCP / IP со всем его великолепием - дрожание сети, отбрасывание пакетов и т. Д.

0 голосов
/ 01 июля 2019

У вас есть функция обратного вызова при приеме (если вы используете HAL) в файле ...._ if.c. Скопируйте полученные символы в буфер. Реализуйте тайм-аут там.

...