簡體   English   中英

如何使用 STM32F1 上的 HAL 庫永遠啟用 uart RX 中斷

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

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