UART 通信问题STM32F411E-DISCO

问题描述

我在理解我的代码如何工作时遇到问题。有人可以在输入'!'后向我解释为什么吗?在终端中字符 7 次我得到了我的文本 xxxxxx 和一大堆不同的奇怪字符。为什么它不以这个文本“xxxxxx”结尾???

#define UART_RX_BUF_SIZE 7
#define UART_TX_BUF_SIZE 7

int8_t uart_put_char(char data); 
int8_t uart_get_char(char *data); 
volatile char uart_rxBuff[UART_RX_BUF_SIZE]; 
volatile char uart_txBuff[UART_TX_BUF_SIZE]; 

void uart_put_string(char *s);

typedef struct {
    volatile char *const buffer;
    uint8_t head;
    uint8_t tail;
} circ_buffer_t;

volatile circ_buffer_t uart_rx_circBuff = { uart_rxBuff,0 };
volatile circ_buffer_t uart_tx_circBuff = { uart_txBuff,0 };

int8_t uart_put_char(char data) {

    uint8_t head_temp = uart_tx_circBuff.head + 1;

    if (head_temp == UART_TX_BUF_SIZE)
        head_temp = 0;

    if (head_temp == uart_tx_circBuff.tail)
        return 0; 

    
    uart_tx_circBuff.buffer[head_temp] = data;
    
    uart_tx_circBuff.head = head_temp;

    __HAL_UART_ENABLE_IT(&huart1,UART_IT_TXE);


    return 0;
    
}

int8_t uart_get_char(char *data) {

    if (uart_rx_circBuff.head == uart_rx_circBuff.tail)
        return -1;

    uart_rx_circBuff.tail++;

    if (uart_rx_circBuff.tail == UART_RX_BUF_SIZE)
        uart_rx_circBuff.tail = 0;

    *data = uart_rx_circBuff.buffer[uart_rx_circBuff.tail];

    return 0;

}


void uart_put_string(char *s) {
    while (*s)
        uart_put_char(*s++);
}




void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
      if (huart->Instance == USART1)
      {

        uint8_t head_temp = uart_rx_circBuff.head + 1;

        if (head_temp == UART_RX_BUF_SIZE)
            head_temp = 0;

        if (head_temp == uart_rx_circBuff.tail) {
            
            __HAL_UART_CLEAR_FLAG(&huart1,UART_IT_RXNE);
        }

    
        else {
            


            HAL_UART_Receive_IT(&huart1,(uint8_t*) &uart_rx_circBuff.buffer[head_temp],1);
            uart_rx_circBuff.head = head_temp;
            

        }
        
        if (uart_tx_circBuff.head == uart_tx_circBuff.tail) {

            __HAL_UART_DISABLE_IT(&huart1,UART_IT_TXE);

        } else {
            uart_tx_circBuff.tail++;

            if (uart_tx_circBuff.tail == UART_TX_BUF_SIZE)
                uart_tx_circBuff.tail = 0;

            

            HAL_UART_Transmit_IT(&huart1,(uint8_t*) &uart_tx_circBuff.buffer[uart_tx_circBuff.tail],1);
        }

    }

}


int main(void) {
    
    HAL_Init();

    
    SystemClock_Config();

    
    MX_GPIO_Init();
    MX_USART1_UART_Init();
    MX_TIM10_Init();

    
    uint8_t head_temp = uart_rx_circBuff.head + 1;


    
    HAL_UART_Receive_IT(&huart1,1);

    
    uart_rx_circBuff.head = head_temp;

    
    while (1) {

char downloaded;
uart_get_char(&downloaded);

if(downloaded== '!'){
    uart_put_string("xxxxxxxxxx");
}



    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)