4

我正在使用 stm32f0 MCU。

我想将从 uart 接收到的每个字节传输到 uart 之外。我正在对从 uart 接收到的每个字节启用中断。

我的代码很简单。

uint8_t Rx_data[5]; 

//Interrupt callback routine
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)  //current UART
    {
        HAL_UART_Transmit(&huart1, &Rx_data[0], 1, 100);        
        HAL_UART_Receive_IT(&huart1, Rx_data, 1);   //activate UART receive interrupt every time on receiving 1 byte
    }
}

我的电脑将 ASCII 传输12345678到 stm32。如果一切正常,PC 应该会收到12345678回复。但是,PC1357改为接收。代码有什么问题?

4

3 回答 3

6

重新启用中断可能效率低下。通过一些修改,可以保持中断处于活动状态,而无需重新编写处理程序。请参阅以下从 stm32cubemx 生成器更改的示例。

/**
* @brief This function handles USART3 to USART6 global interrupts.
*/
void USART3_6_IRQHandler(void)
{
  InterruptGPS(&huart5);
}

void InterruptGPS(UART_HandleTypeDef *huart) {
    uint8_t rbyte;
    if (huart->Instance != USART5) {
        return;
    }
    /* UART in mode Receiver ---------------------------------------------------*/
    if((__HAL_UART_GET_IT(huart, UART_IT_RXNE) == RESET) || (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) == RESET)) {
        return;
    }
    rbyte = (uint8_t)(huart->Instance->RDR & (uint8_t)0xff);
    __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

    // do your stuff

}

static void init_gps() {
    __HAL_UART_ENABLE_IT(&huart5, UART_IT_RXNE);
}
于 2016-05-19T12:20:23.887 回答
2

您还应该创建一个 tx 数组缓冲区,并使用中断进行写入(如果尚未启用第一次写入,则应立即发送)。

STM32周围应该有这样的例子。

于 2016-05-19T07:33:07.003 回答
1

您可能应该切换两条线:传输和接收。Transmit 函数等待超时以发送字符,同时错过下一个接收到的字符。

于 2016-05-18T10:57:54.307 回答