STM32
直播中

杨静

7年用户 1380经验值
私信 关注
[问答]

请问hal库的串口接收完成回调函数中如何区分是不是DMA接收完成?

HAL_UART_RxCpltCallback
这个回调函数在串口中断接收完成后会被调用,在DMA接收完成后也会被调用

那么能否在这个回调函数中直接以参数huart中的信息来区分上述两种情况呢?(不考虑其他外部附加处理方式)

(实际使用情况是在rtthread中改用hal库适配原来的serial处理)

回帖(1)

李英

2024-5-7 17:52:24
在HAL库中,`HAL_UART_RxCpltCallback` 回调函数确实会在串口中断接收完成和DMA接收完成后被调用。为了区分这两种情况,我们可以通过检查 `huart` 结构体中的一些参数来判断。

具体来说,我们可以检查 `huart->hdmarx` 是否为 `NULL`。如果 `hdmarx` 为 `NULL`,则表示当前的接收操作是通过中断完成的;如果 `hdmarx` 不为 `NULL`,则表示当前的接收操作是通过DMA完成的。

下面是一个示例代码,展示了如何在 `HAL_UART_RxCpltCallback` 回调函数中区分这两种情况:

```c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart->hdmarx == NULL) {
        // 通过中断完成的接收
        // 在这里处理中断接收完成的操作
    } else {
        // 通过DMA完成的接收
        // 在这里处理DMA接收完成的操作
    }
}
```

这种方法仅适用于在回调函数中区分中断接收和DMA接收的情况。如果需要在其他地方进行区分,可能需要使用其他方法,例如设置一个全局变量或标志位来记录当前的接收方式。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分