以前用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; //
資料長度記錄
/*最後在main函式裡面編寫接收後的邏輯,注意要在while(1)前開啟串列埠接收中斷重寫串列埠接收**函式
*/void hal_uart_rxcpltcallback(uart_handletypedef*uarthandle)
dowhile(ret !=hal_ok);
if(*(msg-1) == '
\n') //
接收以\n為結尾字元,則表示接收完成
}
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...