Manejo de interrupciones UART usando FreeRTOS

0

Tengo dos hilos:
1. ReadFromUART (): se lee desde UART (RX), analiza el mensaje y pone un comando en el messageQueue
2. CommandHandler (): si un mensaje está presente en el mensajeQueue, ejecuta algunas instrucciones y luego envía un mensaje a través de UART (TX)

void CommandHandler(void const * argument)
{
    osEvent event;
    uint32_t x;
  for(;;)
  {
        event = osMessageGet(pkQueueHandle, 100);
        if (event.status == osEventMessage)
    {
            x = event.value.v;
            if (x == STOP)
            {
                if (HAL_UART_Transmit_IT(&huart1, bufferTX_Stop, sizeof(bufferTX_Stop)) != HAL_OK)
                {
                    Error_Handler();
                }
            }
            if (x == PAUSE)
            {
                if (HAL_UART_Transmit_IT(&huart1, bufferTX_Pause, sizeof(bufferTX_Pause)) != HAL_OK)
                {
                    Error_Handler();
                }               
            }
            if (x == RESUME)
            {
                if (HAL_UART_Transmit_IT(&huart1, bufferTX_Resume, sizeof(bufferTX_Resume)) != HAL_OK)
                {
                    Error_Handler();
                }               
            }
            if (x == START)
            {
                if (HAL_UART_Transmit_IT(&huart1, bufferTX_Start, sizeof(bufferTX_Start)) != HAL_OK)
                {
                    Error_Handler();
                }               
            }
        }
    osDelay(1);
  }
}

void vReadFromUART(void const * argument)
{
    uint32_t cmd_ID;
  for(;;)
  {

        if (HAL_UART_Receive_IT(&huart1, (uint8_t *)bufferRX, 2) != HAL_OK)
    {
            Error_Handler();
    }

        if (memcmp(bufferRX, "ST", 2) == 0)
            cmd_ID = START;
        if (memcmp(bufferRX, "PA", 2) == 0)
            cmd_ID = PAUSE;
        if (memcmp(bufferRX, "RE", 2) == 0)
            cmd_ID = RESUME;
        if (memcmp(bufferRX, "SP", 2) == 0)
            cmd_ID = STOP;


        if (osMessagePut(pkQueueHandle, cmd_ID, 100) != osOK)
        {
            Error_Handler();
        }
    while (HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY);
    osDelay(1);
  }
  /* USER CODE END vReadUARTCommand */
}

Como puede ver, estoy usando interrupciones de UART (RXNE y TC) para manejar el flujo de datos de UART. El problema es que las entradas ya no se detectan. Pensé que esto podría deberse al cambio de contexto, usé vTaskSuspendAll() antes de HAL_UART_Receive_IT() pero el problema sigue ahí.

Quiero entender cómo manejar las interrupciones de UART con FreeRTOS

    
pregunta Pryda

0 respuestas

Lea otras preguntas en las etiquetas