cancel
Showing results for 
Search instead for 
Did you mean: 

2 UART running in FreeRTOS

matke2002
Associate II
Posted on April 07, 2016 at 15:11

Hi,

I use 2 UART ports: UART1 for WiFi and UART4 for debug output.

My goal is to send to UART4 data I received on UART1.

When I use only 1 UART, it works (UART4), everything I typed on keyboard, returned back.

I implemented next:

char RX1[2], RX4[2];

SerialCrtl com4_ctrl, com1_ctrl; // structure for data buffer

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  /// callback function for UART, adding received data into buffer

{

    if (huart->Instance == UART4) {

        com4_ctrl.recv_buffer[com4_ctrl.recv_buffer_end++] = RX4[0];

        HAL_UART_Receive_IT(&huart4, RX4, 1);    //activate UART receive interrupt every time

    } else  if (huart->Instance == USART1) {

        com1_ctrl.recv_buffer[com1_ctrl.recv_buffer_end++] = RX1[0];

        HAL_UART_Receive_IT(&huart1, RX1, 1);    //activate UART receive interrupt every time

    }

}

and function for FreeRTOS (this works when I use only UART4):

void readCom(void const *pvParameters) {

    com1_ctrl.recv_buffer_end = 0;

    memset(com1_ctrl.recv_buffer, 0, sizeof(com1_ctrl.recv_buffer));

    while(1) {

        if (com1_ctrl.recv_buffer_end > 0) {

            //strcpy(com4_ctrl.send_buffer, com4_ctrl.recv_buffer);

            sprintf(com4_ctrl.send_buffer, ''OUT> [%s] [%d]\r\n'',

                    com4_ctrl.recv_buffer, com1_ctrl.recv_buffer_end);

            com4_ctrl.send_buffer_length = strlen(com4_ctrl.send_buffer);

            //HAL_UART_Transmit(&huart4, com4_ctrl.send_buffer, com4_ctrl.send_buffer_length, 1000);

            HAL_UART_Transmit(&huart4, com1_ctrl.recv_buffer, com4_ctrl.recv_buffer_end, 1000);

            HAL_Delay(100);

            memset(com4_ctrl.send_buffer, 0, sizeof(com4_ctrl.send_buffer));

            memset(com1_ctrl.recv_buffer, 0, sizeof(com1_ctrl.recv_buffer));

            com4_ctrl.send_buffer_length = com1_ctrl.recv_buffer_end = com1_ctrl.recv_buffer_start = 0;

        }

        HAL_Delay(2000);

        HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_14);

    }

}

in main() I added these 2 lines for activation of interupt for UART:

HAL_UART_Receive_IT(&huart4, RX4, 1);

HAL_UART_Receive_IT(&huart1, RX1, 1);

I also tried without callback function, I added in thread function what only reads UARTs, but it works also only with one active UART.

Any idea what's wrong here?

Cheers

#freertos #hal #uart
0 REPLIES 0