OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3380|回复: 4

串口接收中断只能进入一次

[复制链接]

1

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2023-9-6
在线时间
2 小时
发表于 2023-9-6 20:57:13 | 显示全部楼层 |阅读模式
我希望通过串口向单片机发送U1,单片机返回一个字符串“measure”; 我的回调函数里最后是重新开启了接收中断,希望可以连续接收,但是每次只能第一次计入中断,后面串口助手再发送U1,串口助手接收不到返回的数据,只能接收到第一次的
uint8_t cmd[2];
uint8_t cmd[2] = "0" ;
uint8_t usart1_tx_buf[]= "measure\r\n" ;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance == USART1){
                if(cmd[0] == 'U'&&cmd[1] == '1')
        {

            HAL_UART_Transmit(&huart1,usart1_tx_buf, sizeof(usart1_tx_buf),1000);

            HAL_UART_Transmit_DMA(&huart1, usart1_tx_buf, sizeof(usart1_tx_buf));
            while (1)
            {
                /* 等待 DMA1_Channel4 传输完成 */
                if ( __HAL_DMA_GET_FLAG(&huart1, DMA_FLAG_TC4))  /* 等待 DMA1_Channel4 传输完成 */
                {
                    __HAL_DMA_CLEAR_FLAG(&huart1, DMA_FLAG_TC4); /* 清除 DMA1_Channel4 传输完成标志 */
                    HAL_UART_DMAStop(&huart1);       /* 传输完成以后关闭串口DMA */
                    break;
                }
            }

            HAL_UART_Receive_IT(&huart1, cmd, 2);
                }

        }

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-9-7 09:38:17 | 显示全部楼层
为什么先调用HAL_UART_Transmit,后调用HAL_UART_Transmit_DMA?
知道它们干嘛用的吗?
知道HAL_UART_RxCpltCallback函数是在哪被调用的吗?是在中断里还是主循环里?
中断里长时间等待有没有坏处?
专治疑难杂症
回复 支持 0 反对 1

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2023-9-6
在线时间
2 小时
 楼主| 发表于 2023-9-6 21:03:23 | 显示全部楼层
而且如果我只接收一个字符的话,又是可以连续接收的
uint8_t cmd;
uint8_t cmd = '0' ;
uint8_t usart1_tx_buf[]= "measure\r\n" ;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        if(huart->Instance == USART1){
                if(cmd == 'U')
        {
  
            HAL_UART_Transmit(&huart1,usart1_tx_buf, sizeof(usart1_tx_buf),1000);
            
            HAL_UART_Transmit_DMA(&huart1, usart1_tx_buf, sizeof(usart1_tx_buf));
            while (1)
            {
                /* 等待 DMA1_Channel4 传输完成 */
                if ( __HAL_DMA_GET_FLAG(&huart1, DMA_FLAG_TC4))  /* 等待 DMA1_Channel4 传输完成 */
                {
                    __HAL_DMA_CLEAR_FLAG(&huart1, DMA_FLAG_TC4); /* 清除 DMA1_Channel4 传输完成标志 */
                    HAL_UART_DMAStop(&huart1);       /* 传输完成以后关闭串口DMA */
                    break;
                }
            }
                     
            
                }
        
        HAL_UART_Receive_IT(&huart1, &cmd, 1);
        }

}
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2023-9-6
在线时间
2 小时
 楼主| 发表于 2023-9-7 16:03:41 | 显示全部楼层
我找到问题了,我重新拔插了一下串口线就没有问题了,两种串口接收中断都正常了
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2023-9-6
在线时间
2 小时
 楼主| 发表于 2023-9-7 20:29:40 | 显示全部楼层
重新拔插串口线厚下午再次出现同样的问题,最终经过几个小时的排查发现是串口产生了ORE过载错误,所以下一次再次使能接收中断,就不可以再次接收。解决办法就是清除错误状态和数据寄存器
__HAL_UART_CLEAR_OREFLAG(&huart2);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 15:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表