STM32/STM8技术论坛
直播中

赵辰斌

未满1年用户 4经验值
擅长:嵌入式技术
私信 关注
[问答]

STM32程序进入循环后单片机串口不工作

移植的是正点原子的ESP8266代码,在进入while(1)之前可以接收到从串口助手发送的消息,进入while(1)之后就接收不到了,接收中断函数如下
void ATK_MW8266D_UART_IRQHandler(void)
{
uint8_t tmp;
if (__HAL_UART_GET_FLAG(&g_uart_handle, UART_FLAG_ORE) != RESET) /* UART接收过载错误中断 /
{
__HAL_UART_CLEAR_OREFLAG(&g_uart_handle); /
清除接收过载错误中断标志 /
(void)g_uart_handle.Instance->SR; /
先读SR寄存器,再读DR寄存器 */
(void)g_uart_handle.Instance->DR;
// printf("debug");
}

if (__HAL_UART_GET_FLAG(&g_uart_handle, UART_FLAG_RXNE) != RESET)       /* UART接收中断 */
{
    HAL_UART_Receive(&g_uart_handle, &tmp, 1, HAL_MAX_DELAY);           /* UART接收数据 */
    
    if (g_uart_rx_frame.sta.len < (ATK_MW8266D_UART_RX_BUF_SIZE - 1))   /* 判断UART接收缓冲是否溢出
                                                                         * 留出一位给结束符'\0'
                                                                         */
    {
        g_uart_rx_frame.buf[g_uart_rx_frame.sta.len] = tmp;             /* 将接收到的数据写入缓冲 */
        g_uart_rx_frame.sta.len++;                                      /* 更新接收到的数据长度 */

// printf("debug1");
}
else /* UART接收缓冲溢出 /
{
g_uart_rx_frame.sta.len = 0; /
覆盖之前收到的数据 /
g_uart_rx_frame.buf[g_uart_rx_frame.sta.len] = tmp; /
将接收到的数据写入缓冲 /
g_uart_rx_frame.sta.len++; /
更新接收到的数据长度 */
}
// printf("debug2");
//printf("%s",g_uart_rx_frame.buf);
}

if (__HAL_UART_GET_FLAG(&g_uart_handle, UART_FLAG_IDLE) != RESET)       /* UART总线空闲中断 */
{
    g_uart_rx_frame.sta.finsh = 1;                                      /* 标记帧接收完成 */

// printf("debug3");
// printf("%s",g_uart_rx_frame.buf);
__HAL_UART_CLEAR_IDLEFLAG(&g_uart_handle); /* 清除UART总线空闲中断 */
}
}

回帖(1)

Arvinhw

2024-5-11 17:36:06
从您提供的代码和描述来看,问题可能出现在while(1)循环中,导致串口接收中断无法正常工作。以下是一些建议和可能的解决方案:

1. 确保while(1)循环中没有阻塞或死锁的情况。检查循环中的代码,确保没有无限等待或长时间占用CPU的情况。

2. 在while(1)循环中添加适当的延时,以确保系统有足够的时间处理其他任务,包括串口接收中断。您可以使用HAL_Delay()函数添加延时。

3. 检查串口接收中断是否被正确配置和启用。确保在初始化过程中,串口接收中断被正确设置。

4. 在while(1)循环中添加一个标志变量,用于检测串口接收中断是否被触发。这样,您可以在循环中检查该标志变量,以确定是否接收到了数据。

5. 检查串口接收中断函数中的代码,确保没有错误地清除了接收到的数据。例如,确保在读取数据后,没有再次读取SR寄存器,这可能导致数据丢失。

6. 如果问题仍然存在,尝试使用其他串口接收中断示例代码,以排除代码问题。

7. 如果您使用的是正点原子的ESP8266代码,可以尝试联系正点原子的技术支持,以获取更专业的帮助。

希望这些建议能帮助您解决问题。如果您需要进一步的帮助,请提供更多的代码和信息。
举报

更多回帖

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