[英]How to keep uart RX interrupt enabled forever using HAL library on a STM32F1
我看到 HAL 提供了以下函數來接收帶有中斷的串行數據: HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
它基本上設置了 rx 中斷和返回。
一旦接收到的字節數達到Size
就會調用HAL_UART_RxCpltCallback()
。
HAL 在執行此回調之前禁用 rx 中斷
問題:
傳入字節的數量是可變的(從 1 到 ~100),我需要將它們放入環形緩沖區。
因此,我將Size
設置為 1 並在回調中再次調用HAL_UART_Receive_IT()
以重新啟用中斷,如果板子HAL_UART_Receive_IT()
發送 1 或 2 個字節,它會很好地工作,但超出的字節會丟失
我的猜測是它們被錯過了,因為它們在中斷禁用 - 啟用之間到達
有沒有辦法讓中斷永遠運行而不覆蓋 HAL Cube 生成的代碼?
如果沒有,覆蓋相關功能的干凈方法是什么?
是否有我遺漏的東西可以避免找到此解決方案的需要?
試試這個
__HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
帶有 DMA(用於接收)的循環緩沖區似乎是滿足您要求的解決方案。 這將始終提供 RX 中斷(您只需配置一次)。
對於類似的要求,我通常使用 1 字節的循環緩沖區來處理數據。 接收處理將在 ISR 中完成。
您可以通過輪詢方法而不是中斷方法來嘗試 UART。 輪詢方式:UART 直到收到“Size”參數指定的數據量后才會返回。
我認為您必須放置一個特殊字符來指示消息的結束,或者您創建自己的協議,例如消息頭、消息長度、內容、校驗和,然后啟用一個字節的中斷,並在中斷處理程序中存儲接收緩沖區,直到找到消息中的最后一個字節,然后在 RTOS 的情況下發送到主任務,或設置全局標志。 順便說一下,請確保在中設置適當的接收字節大小
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
里面
HAL_UART_RxCpltCallback
請檢查HAL_UART_Receive_IT
的返回,它可能返回錯誤並實現
void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle);
並檢查 UART 總線是否有錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.