OpenEdv-开源电子网

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

串口就收中断无法进入,可能同时接收和发送了

[复制链接]

31

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-5-3
在线时间
69 小时
发表于 2021-1-11 16:43:34 | 显示全部楼层 |阅读模式
1金钱
发:at+send=lora:1:000B0000079600000000
收:OK
收:at+recv=0,-32,7,0
发:at+set_config=device:sleep:1
发:at+set_config=device:sleep:1
收:OK Sleep


一般情况下,数据发送完只回应OK。但偶尔会在OK后面接在回应at+recv=0,-32,7,0;导致后续串口在发送sleep指令时,同时接收at+recv=0,-32,7,0;
这个情况导致sleep指令模块无法识别,还有mcu的串口接收中断无法进入了,必须重新初始化,这个怎么解决????

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */

        UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
  */
                RX_BUFF[RX_CNT]=aRxBuffer;
                if((RX_BUFF[RX_CNT] == 0x0A) && ((RX_BUFF[RX_CNT-1] == 0x0D)))//判断接收是否结束
                {
                                RX_CNT = 0;                                       
                                //接收完成标志位

                        if(PorRest_Flag ==2)
                        {
                                        //不判断接收错错误数据,收到错误数据,直接等待超时
                                        if( (RX_BUFF[0] == 0x4F) && (RX_BUFF[1] == 0x4B) && (RX_BUFF[15] == 0x0D) && (RX_BUFF[16] == 0x0A)) //OK Join Success
                                        {
                                                HAL_TIM_Base_Stop_IT(&htim14);       
                                                Send_Join_Count        = 0;
                                                memset(RX_BUFF,0,20);
                                                join_Retran_Times = 0;
                                                PorRest_Flag = 0;
                                                Sleep_flag = 1;

                                        }
                        }
                        else if(Send_Complete_Flag == 2)
                        {
                                        if( (RX_BUFF[0] == 0x4F) && (RX_BUFF[1] == 0x4B) && (RX_BUFF[2] == 0x0D) && (RX_BUFF[3] == 0x0A))//OK
                                        {
                                                        HAL_TIM_Base_Stop_IT(&htim14);
                                                        Send_Date_count        = 0;
                                                        memset(RX_BUFF,0,20);
                                                        Data_Retran_Times = 0;
                                                        Send_Complete_Flag = 0;
                                                Sleep_flag = 1;
////                                                        DatePack_Num =0x55;
////                                                        HAL_UART_Transmit(&huart1,&DatePack_Num,1,0xffff);                                               
                                        }
                        }

                        else if(Send_Sleep_Flag == 2)
                        {
                                        //不判断接收错错误数据,收到错误数据,直接等待超时
//                                        if( (RX_BUFF[0] == 0x4F) && (RX_BUFF[1] == 0x4B) && (RX_BUFF[2] == 0x20) && (RX_BUFF[3] == 0x53)&& (RX_BUFF[4] == 0x6C) && (RX_BUFF[5] == 0x65)&& (RX_BUFF[6] == 0x65)&& (RX_BUFF[6] == 0x70)) //OK Sleep
                                if( (RX_BUFF[0] == 0x4F) && (RX_BUFF[1] == 0x4B) && (RX_BUFF[8] == 0x0D) && (RX_BUFF[9] == 0x0A)) //OK Sleep
                                {
                                                HAL_TIM_Base_Stop_IT(&htim14);       
                                                Send_Sleep_Count        = 0;
                                                memset(RX_BUFF,0,20);
                                                Sleep_flag = 2;
                                                Send_Sleep_Flag = 0;
                                                Sleep_Retran_Times = 0;
                                        }

                        }else{
                                        memset(RX_BUFF,0,20);
                       
                        }

                }else{
                        RX_CNT++;
                }
                HAL_UART_Receive_IT(&huart1, (uint8_t*)&aRxBuffer, 1);//每接收一个字节后,重新开启接收中断
}


/*  HAL_UART_Transmit 函数(这是一个阻塞的发送函数,无需重复判断串口是否发送完成)
    发送每个字符,直到遇到
    空字符才停止发送。*/
void Usart_SendString(UART_HandleTypeDef *usarthandle,uint8_t *str)
{
        unsigned int k=0;
  do
  {
      HAL_UART_Transmit(usarthandle,(uint8_t *)(str + k) ,1,1000);
      k++;
  } while(*(str + k)!='\0');

}

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

使用道具 举报

31

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-5-3
在线时间
69 小时
 楼主| 发表于 2021-1-11 16:46:33 | 显示全部楼层
具体串口接收时间如图
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2021-1-11 22:14:14 | 显示全部楼层
中断里不做那么多处理试试。数据回主函数处理。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-14 18:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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