RTOS удобнее использовать, потому-что ещё куча всего по мимо UART.
Задачу решил так:
Код
static uint8_t Raw[SIZE_BUFF];//Буфер для UART
static volatile uint32_t RxFrameLength;//Счётчик символов //RxFrameLength - счётчик длина принятых сообщений перед отправкой запроса в UART обнуляеться.
static xSemaphoreHandle xSemaphoreRx; //Семафор приёма данных от UART
static portBASE_TYPE xHigherPriorityTaskWoken;
/**/
/ * Обработчик для прерывания от UART*/
/**/
static void Comm_UART_RxHandler(uint8_t Data) //Приём данных из UART
{
if (Data == 0x00) // Ждем конец посылки
{
if (RxFrameLength > 0)
{
// RxFrameReady = 1;
xSemaphoreGiveFromISR(xSemaphoreRx, &xHigherPriorityTaskWoken); //Отдаём семафор
}
}
else
{
if (RxFrameLength < SIZE_BUFF)
Raw[RxFrameLength++] = Data;
else
{
RxFrameLength = 0;
}
}
}
/**/
/*Задача обработчик*/
/**/
void Task(void* P)
{
if (xSemaphoreTake(xSemaphoreRx, Timeout) == pdTRUE) //:Ждём ответа определенное время
{
//Разгребаем данные
}
}