簡體   English   中英

為什么 UART 繼續寫入我的 25 字節緩沖區,它停止了哪個字節?

[英]Why does UART keep continuing to write my 25 byte buffer which byte it left off?

我有一個在 STM32F1 上運行的基於中斷 ( RXNE ) 的接收周期。 我只使用接收命令,它是:

HAL_UART_Receive_IT(&huart3, RxBuffer, sizeof(RxBuffer));

因此我收到一條消息然后寫我的緩沖區是:

uint8_t RxBuffer[25];

使用RxBuffer的內容后,我使用 function 清除這個數組:

memset(RxBuffer, '\0', sizeof(RxBuffer));

傳入的數據永遠不會超過 24 字節 btw。 一切正常,直到收到另一個數據並將其寫入RxBuffer 當接收到下一個數據時,會發生一些奇怪的事情, HAL_UART_Receive_IT(&huart3, RxBuffer, sizeof(RxBuffer)); function 開始將數據填充到我的RxBuffer中,它在上次接收時遺漏了哪個字節。

例如;

1 -> RxBuffer 通常用 NULL 初始化

RxBuffer = {'\0', '\0', '\0', '\0', ... '\0'} (25 字節 NULL)

2 -> 收到第一個數據后就變成這樣

RxBufer = "xc32 CMD1 400 200 50" (總共 20 個字節,最后 5 個字節仍然為 NULL)

RxBuffer = {'x', 'c', '3', '2', ' ', 'C'... '\0', '\0', '\0'}

3 -> 然后我使用memset(...) function 清除緩沖區內容。

RxBuffer = {'\0', '\0', '\0', '\0', ... '\0'} (還是 25 字節 NULL)

4 -> 收到另一個數據后,如“xc32 CMD2”:

RxBuffer = {'C', 'M', 'D', '2', '\0', '\0', '\0'... 'x', 'c', '3', '2', ' '} (仍然是 25 個字節的數據,但是 UART 開始寫入它上次停止的那個字節的數據,它變成了一些移位的狗屎。)

它的行為就像一個環形緩沖區。 如何正確執行此接收過程以使其在每次接收時都從緩沖區的第 0 個索引開始?

因為它是中斷例程,所以它在后台工作。 並且它將接收數據到該緩沖區,直到緩沖區結束。

如果您的數據不是固定長度的,您應該啟用“IDLE”中斷並在此中斷處理程序中處理數據(或更好地在 HAL 回調中)。 然后重新啟動接收。

這個問題可以通過使用 DMA 逐字節接收數據來解決。

char rx_buff[10];
HAL_UART_Receive_DMA(&huart1, (uint8_t*)rx_buff, 1);

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    ...
    array[i++] = rx_buff[0];
    /* Then reset buffer using bzero() or memset() */
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM