首页 > 解决方案 > STM32F103RB Nucleo收发usart

问题描述

我在使用 usart 进行传输和接收时遇到了一些问题。我要传输的第一个信息被写入循环缓冲区。然后发送信息,但丢失了一些信息。

变量

enum {
    BUF_SIZE = 100
};
char BUF_T[BUF_SIZE], BUF_R[BUF_SIZE];
uint8_t R_EMPTY = 0, R_BUSY = 0, T_EMPTY = 0, T_BUSY = 0;

传输

void Send(void) {
    uint8_t index = T_EMPTY;
    for (int i = 0; i < 10; i++) {
        BUF_T[index] = i+'0';
        index++;
        if (index >= BUF_SIZE) {
            index = 0;
        }

    }
    __disable_irq();
    if (T_BUSY == T_EMPTY
            && __HAL_UART_GET_FLAG(&huart2,UART_FLAG_TXE) == SET) {
        T_EMPTY = index;
        T_BUSY++;
        uint8_t tmp = BUF_T[T_BUSY];

        if (T_BUSY >= BUF_SIZE) {
            T_BUSY = 0;
        }
        HAL_UART_Transmit_IT(&huart2, (uint8_t*) &tmp, 1);
    } else {
        T_EMPTY = index;
    }
    __enable_irq();
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) {

    //if (huart->Instance == USART2) {

    if (T_BUSY != T_EMPTY) {
        __disable_irq();
        T_BUSY++;
        uint8_t tmp = BUF_T[T_BUSY];
        if (T_BUSY >= BUF_SIZE) {
            T_BUSY = 0;
        }

        HAL_UART_Transmit_IT(&huart2, (uint8_t*) &tmp, 1);
        __enable_irq();
    }else {
        Send();
    }

    //}

}

来自 hterm 的屏幕

从图片中可以看出,有时会丢失一个字符。我不明白为什么?

关于接收,有人可以告诉mi是否可以吗?

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {

    //if (huart->Instance == USART2) {
    uint8_t tmp = BUF_R[R_EMPTY];
    R_EMPTY++;
    if (R_EMPTY >= BUF_SIZE) {
        R_EMPTY = 0;
    }
    HAL_UART_Receive_IT(&huart2, (uint8_t*) &tmp, 1);
    //}
}

标签: cmicroprocessors

解决方案


推荐阅读