STM32
直播中

丁冬芹

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

STM32 hal库无法接收串口数据是怎么回事?

型号:STM32L432KC官方开发板
串口使用的是板载的USB下载口以及串口

用法:
在串口初始化后,while(1)之前调用 接收中断函数 HAL_UART_Receive_IT(),接收一个字节产生中断。在接收中断回调函数中处理保存数据并重新开启接收一个字节的中断。
回掉函数的代码:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)  
{  
//                printf("rx callback!n");

                buf[cnt++] = data;
               
    uint8_t ret = HAL_OK;  
    /* Set transmission flag: trasfer complete*/  
    do  
    {  
        ret = HAL_UART_Receive_IT(UartHandle, (uint8_t *) data, 1);  
    }while(ret != HAL_OK);  
}



现象:
上电后会产生一次串口中断,进入这个函数。但此时并没有发送数据。

另外,后续发送任何数据都没有反应。无法产生中断。



回帖(1)

早知

2024-4-29 18:10:00
STM32 HAL库无法接收串口数据可能有以下几个原因:

1. 串口初始化配置错误:请检查您的串口初始化配置,确保波特率、数据位、停止位和奇偶校验位等参数与发送端相匹配。

2. 中断配置错误:请确保您已经正确配置了串口接收中断,并且在中断回调函数中正确处理了数据。

3. DMA配置错误:如果您使用了DMA(直接内存访问)来接收数据,请检查DMA的配置是否正确。

4. USB串口驱动问题:请确保您的计算机已经正确安装了STM32的USB串口驱动。

5. 串口线连接问题:请检查您的串口线是否连接正确,以及是否有损坏。

6. 串口接收缓冲区溢出:请确保您的接收缓冲区足够大,以避免数据丢失。

针对您提供的回调函数代码,我建议您检查以下几点:

1. 确保`buf`数组的大小足够大,以存储接收到的数据。

2. 在回调函数中,确保您已经正确地保存了接收到的数据,并重新开启了接收中断。例如:

```c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
    // 保存接收到的数据
    // ...

    // 重新开启接收一个字节的中断
    HAL_UART_Receive_IT(&huart1, &buf[cnt], 1);
    cnt++;
}
```

3. 在主循环中,检查`cnt`变量的值,以确保数据已经接收。例如:

```c
while (1)
{
    if (cnt > 0)
    {
        // 处理接收到的数据
        // ...
        cnt = 0; // 重置计数器
    }
}
```

请尝试以上建议,如果问题仍然存在,请提供更详细的代码和错误信息,以便进一步分析。
举报

更多回帖

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