[英]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.