STM32F103RB Nucleo передавать и получать usart - PullRequest
0 голосов
/ 27 ноября 2018

У меня проблемы с передачей и приемом через 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

На картинке видно, что время от времени один символ теряется.Я не понимаю, почему?

Что касается получения, может кто-нибудь сказать мне, если все в порядке?

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);
    //}
}
...