1. HAL_UART_Receive_DMA函數(shù)
基本功能
- 作用:啟動(dòng)一個(gè)固定長(zhǎng)度的 DMA 數(shù)據(jù)接收。
- 特點(diǎn):
- 需要預(yù)先指定接收數(shù)據(jù)的長(zhǎng)度(
Size
參數(shù))。 - DMA 會(huì)一直工作直到接收到指定數(shù)量的數(shù)據(jù),接收完成后觸發(fā)
HAL_UART_RxCpltCallback
回調(diào)函數(shù)。 - 如果在數(shù)據(jù)未接收完整之前發(fā)送停止信號(hào)或超時(shí),不會(huì)自動(dòng)停止 DMA 接收。
使用場(chǎng)景
- 適合已知固定數(shù)據(jù)長(zhǎng)度的通信,例如:
- 一次性傳輸?shù)臄?shù)據(jù)長(zhǎng)度固定(如幀協(xié)議固定長(zhǎng)度)。
- 數(shù)據(jù)傳輸中不會(huì)因傳輸長(zhǎng)度未知而中斷。
使用方式
HAL_UART_Receive_DMA(&huart1, buffer, length);
限制
- 只能接收固定長(zhǎng)度的數(shù)據(jù),無(wú)法處理長(zhǎng)度未知或可變的數(shù)據(jù)幀。
- 在需要停止 DMA 接收時(shí),需要手動(dòng)調(diào)用
HAL_UART_DMAStop()
。
2. HAL_UARTEx_ReceiveToIdle_DMA
基本功能
- 作用:啟動(dòng) DMA 接收并監(jiān)控 UART 的空閑中斷(IDLE Line Interrupt)。
- 特點(diǎn):
- 數(shù)據(jù)接收過(guò)程中,檢測(cè)到 UART 空閑線(IDLE)事件時(shí)停止 DMA 并觸發(fā)回調(diào)函數(shù)(
HAL_UARTEx_RxEventCallback
)。 - 空閑線事件指的是 UART 接收線路在規(guī)定時(shí)間內(nèi)未接收到新數(shù)據(jù)。
- 支持接收數(shù)據(jù)長(zhǎng)度不確定的通信模式,適用于處理變長(zhǎng)或幀協(xié)議中的幀間間隔。
使用場(chǎng)景
- 適合處理長(zhǎng)度不固定或帶幀協(xié)議的通信,例如:
- 通信協(xié)議中幀數(shù)據(jù)長(zhǎng)度不確定,通過(guò)幀間超時(shí)來(lái)區(qū)分幀。
- 變長(zhǎng)數(shù)據(jù)傳輸場(chǎng)景,如 Modbus、串口 JSON 數(shù)據(jù)包等。
使用方式
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, buffer, bufferSize);
實(shí)現(xiàn)機(jī)制
- UART 接收到數(shù)據(jù)時(shí),DMA 會(huì)將數(shù)據(jù)存入接收緩沖區(qū)。
- 如果在幀數(shù)據(jù)間隔超時(shí)時(shí)間內(nèi),UART 檢測(cè)到空閑線中斷(IDLE),則認(rèn)為當(dāng)前數(shù)據(jù)幀結(jié)束,調(diào)用
HAL_UARTEx_RxEventCallback
通知用戶。 - 回調(diào)函數(shù)參數(shù)中可以獲取實(shí)際接收到的數(shù)據(jù)長(zhǎng)度。
優(yōu)勢(shì)
- 動(dòng)態(tài)接收長(zhǎng)度,支持變長(zhǎng)數(shù)據(jù)包。
- 減少通信協(xié)議解析的復(fù)雜性,適合幀協(xié)議。
3. 區(qū)別對(duì)比
特性 | HAL_UART_Receive_DMA | HAL_UARTEx_ReceiveToIdle_DMA |
---|
觸發(fā)機(jī)制 | 固定長(zhǎng)度接收完成后觸發(fā) | 空閑線中斷或接收緩沖區(qū)滿觸發(fā) |
適用場(chǎng)景 | 固定長(zhǎng)度數(shù)據(jù)接收 | 變長(zhǎng)數(shù)據(jù)幀或基于超時(shí)的通信協(xié)議 |
回調(diào)函數(shù) | HAL_UART_RxCpltCallback | HAL_UARTEx_RxEventCallback |
需要指定數(shù)據(jù)長(zhǎng)度 | 是 | 否 |
支持幀協(xié)議 | 不支持 | 支持 |
實(shí)現(xiàn)復(fù)雜度 | 簡(jiǎn)單 | 較復(fù)雜 |
是否依賴空閑中斷 (IDLE) | 否 | 是 |
4. 應(yīng)用場(chǎng)景舉例
HAL_UART_Receive_DMA
- 固定長(zhǎng)度幀:例如每次接收 128 字節(jié)的數(shù)據(jù)幀。
- 流式數(shù)據(jù):例如傳感器數(shù)據(jù)流,幀長(zhǎng)度固定或無(wú)幀分隔要求。
HAL_UARTEx_ReceiveToIdle_DMA
- 變長(zhǎng)幀協(xié)議:例如 Modbus 通信協(xié)議,根據(jù)幀間間隔判斷一幀結(jié)束。
- 通信間隔大:例如設(shè)備與主機(jī)間隔性發(fā)送數(shù)據(jù),幀長(zhǎng)度未知,幀間間隔可以用空閑中斷檢測(cè)。
5. 總結(jié)
- 如果數(shù)據(jù)長(zhǎng)度固定,選擇
HAL_UART_Receive_DMA
。 - 如果數(shù)據(jù)長(zhǎng)度不固定或基于幀間間隔的協(xié)議,選擇
HAL_UARTEx_ReceiveToIdle_DMA
。這種方法更靈活,但依賴空閑中斷的處理。