STM32 HAL庫使用中斷實現串列埠接收不定長資料

2022-06-27 04:57:08 字數 1253 閱讀 7163

以前用dma實現接收不定長資料,dma的方法接收串列埠助手的資料,全部沒問題,不過如果接收模組返回的資料,而這些資料如果包含回車換行的話就會停止接收,例如接收:at\r\nok\r\n,就只能接收到at\r,導致沒有接收完成,具體原因還沒搞懂,有了解的,希望可以告知一下,dma不定長接收方法傳輸門:

好了,不多說了,現在進入正文。首先建立乙個stm32cumebx的工程,開啟串列埠中斷,完成配置,具體的配置流程就不細說了,沒什麼難度就只是開啟串列埠跟中斷而已。

生成工程**後,先定義好一些變數:

//

串列埠4中斷接收定義

#define max_recv_len 1024 //

設定可以接收的最大位元組

uint8_t msg_buff[max_recv_len] = ; //

接收快取區

uint8_t * msg = msg_buff; //

定義乙個指標指向接收快取區

int flag = 0; //

接收完成標誌

int len_u4=0; //

資料長度記錄

接著重寫串列埠接收**函式

/*

重寫串列埠接收**函式

*/void hal_uart_rxcpltcallback(uart_handletypedef*uarthandle)

dowhile(ret !=hal_ok);

if(*(msg-1) == '

\n') //

接收以\n為結尾字元,則表示接收完成

}

最後在main函式裡面編寫接收後的邏輯,注意要在while(1)前開啟串列埠接收中斷

int main(void

) hal_delay(

10);

}//******************************

/*user code end 3

*/}

執行結果如下,效果正確

談談串列埠rs232跟rs485:這兩個串列埠除了邏輯電平不同外,還有傳輸距離也不同,如果對速度要求不高,傳輸距離要比較遠的就用rs485比較好,雖然rs485是個半雙工,但是抑制共模干擾能力比較強,不過這些只是對於硬體層面的,對於軟體層面來說他們的本質都是串列埠,在stm32cubemx中,都是只是配置為串列埠,按照串列埠的程式設計來處理即可。

STM32HAL庫中斷函式原理

hal uart receive it函式分析 hal statustypedef hal uart receive it uart handletypedef huart,uint8 t pdata,uint16 t size process locked 設定程序鎖 可以理解為接受過程中不被其他...

STM32 HAL庫中斷的大概流程

1.初始化相應的gpio 定時器等中斷源不必多說 2.設定優先順序 啟動函式等 user code begin 1 void exti9 5 irqhandler void hal gpio exti irqhandler gpio pin 7 這個函式是hal庫函式,可以追蹤到源頭 void ha...

STM32 HAL庫學習筆記

1 系統時鐘 一般用stm32cube生成,使用者只需要會用stm32cube就行。2 gpio輸出void led gpio config void 3 gpio輸入void key gpio config void 4 外部中斷void exti key config void void ext...