Способ работы HAL_UART_Receive_IT
состоит в том, что вы настраиваете его для получения указанного количества данных в данный буфер.Вы даете ему свой буфер, в который он будет читать полученные данные и количество байтов, которые вы хотите получить.Затем он начинает получать данные.Как только получен именно такой объем данных, вызывается функция обратного вызова HAL_UART_RxCpltCallback
(из IRQ), где вы можете делать с этими данными все, что хотите, например, добавлять их в какую-то очередь для последующей обработки в контексте задачи.
Если я хочу выразить свой опыт работы с модулем UART HAL, это то, что он не самый лучший для общего использования, когда вы не знаете объем данных, который вы ожидаете получить заранее.В случае с модемом M66, о котором вы упомянули, это будет происходить постоянно.
Чтобы решить эту проблему, у вас есть два варианта:
Просто не используйте функции HAL ввсе в случае UART, кроме функций инициализации.Реализуйте свой собственный обработчик прерываний UART (большая часть кода может быть скопирована из обработчика в HAL), где после получения данных вы помещаете полученные байты в очередь приема байтов, обработанную в вашей задаче RTOS.В этой задаче вы реализуете парсинг протокола.Этот подход я использую лично.
Если вы действительно хотите использовать HAL, но также работать с модулем, который отправляет различное количество данных, позвоните по номеру HAL_UART_Receive_IT
и укажите, что вы хотитеполучать 1 байт каждый раз.Это будет работать, но будет (потенциально намного) медленнее, чем первый подход.Предполагая, что позже вы захотите реализовать некоторую связь по протоколу tcp / ip (вы упомянули модуль M66 GPRS), вы, вероятно, не захотите делать это таким образом.