OpenEdv-开源电子网

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

UcosIII 任务和中断的处理问题

[复制链接]

3

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-8-4
在线时间
10 小时
发表于 2020-6-13 19:17:54 | 显示全部楼层 |阅读模式
10金钱
1.计划使用方法
    探索板任务1发送AT给4G模块,串口中断接收后传到一个全局变量里边,然后任务1判断返回值是否正常,若正常则执行下一条AT

2.现在存在问题
   任务1发送AT后,模块返回了OK,终端里边也有收到这个OK。但之后之后就不会继续往下执行其他AT了

3.不知道是任务和终端之间没有切换还是终端处理的问题,请帮忙看下是什么原因?

4.代码如下:
   1)中断处理函数
        void USART2_IRQHandler(void)
   {
           u8 res;
           u8 *Rres;
           #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
                OSIntEnter();   
                #endif
           if(USART_GetITStatus(USART2,USART_IT_RXNE))
                   {
                   res=USART_ReceiveData(USART2);  
                   USART_ClearITPendingBit(USART2,USART_IT_RXNE);
                   if (res==0x0D){          
                           UART_Recv.gFlagForDisp=1;
                           UART_Recv.RevBuff[UART_Recv.i++]=res;
                           return;         
                   }
                   if (res==0x0A)
                           {
                                   if (UART_Recv.gFlagForDisp==1)
                                           {
                                           UART_Recv.RevBuff[UART_Recv.i++]=res;
                                           memcpy(Analysis_Recv.AnaBuff, UART_Recv.RevBuff, UART_Recv.i+1);   
                                           Neoway_UART_PRINT(USART1,Analysis_Recv.AnaBuff,UART_Recv.i);
                                           UART_Recv.i=0;
                                           UART_Recv.gFlagForDisp=0;
                                           memset(UART_Recv.RevBuff, 0,RevBuff_Len_MAX);  //将该数组初始化                                                                                  
                                           }
                           }
                           else
                           {
                                   if (UART_Recv.gFlagForDisp==1)
                                           {
                                                   UART_Recv.RevBuff[UART_Recv.i++]=res;
                                                   memcpy(Analysis_Recv.AnaBuff, UART_Recv.RevBuff, UART_Recv.i+1);   
                                                   Neoway_UART_PRINT(USART1,Analysis_Recv.AnaBuff,UART_Recv.i);
                                                   memset(UART_Recv.RevBuff, 0,RevBuff_Len_MAX);  //将该数组初始化
                                                   UART_Recv.i=0;
                                                   UART_Recv.RevBuff[UART_Recv.i++]=res;
                                                   UART_Recv.gFlagForDisp=0;
                                                   return;
                                           }
                                           else
                                                   {
                                                           UART_Recv.RevBuff[UART_Recv.i++]=res;
                                                           return;
                                                   }                                          
                           }
                   }
           #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
           OSIntExit();                                                                                           
       #endif
   }   

2)任务函数:
  void usart1_task(void *pdata)
{          
        while(1)
        {
                test=Neoway_Send_ATConmmand(USART2,"AT\r",3,"OK",Analysis_Recv.AnaBuff,4,3000);
                if(test==0)
                        Neoway_Send_ATConmmand(USART2,"AT+CSQ\r",7,"OK",Analysis_Recv.AnaBuff,4,3000);
                else
                        {
                        Neoway_Send_ATConmmand(USART2,"AT+CCID\r",8,"OK",Analysis_Recv.AnaBuff,4,3000);
                        }
         
                OSTimeDly(500);
        }
}

3)串口数据处理函数
  u8 Neoway_Send_ATConmmand(USART_TypeDef* USARTx,u8 *send_string,u16 str_len,u8 *dst_string,u8 *recv_string,u8 check_times,u16 timeout)
{
        int times=0;  // 查询次数变量;

        do
    {   
            times++;

                Neoway_USART_Send(USARTx,send_string,str_len);
               
                delay_ms(timeout);                 // 延时300ms;
               
                if( strstr((char *)recv_string,(char *)dst_string)!=NULL )
                {
                       
                        break;
                }
        }while(times<check_times);          
       
        if( timeout>=check_times )
        {
                return -1;//指令执行成功
        }
       
        return 0;//指令执行失败
}
4)附上串口log
[19:16:54.437]收←◆AT
[19:16:57.436]收←◆AT
[19:17:00.436]收←◆AT
[19:17:03.436]收←◆AT+CCID
[19:17:06.435]收←◆AT+CCID
[19:17:09.438]收←◆AT+CCID
[19:17:12.435]收←◆AT+CCID
[19:17:17.935]收←◆AT
[19:17:20.935]收←◆AT
[19:17:20.957]收←◆
OK

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

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-6-13 19:30:16 | 显示全部楼层
#if SYSTEM_SUPPORT_OS   是否打开
回复

使用道具 举报

3

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2019-8-4
在线时间
10 小时
 楼主| 发表于 2020-6-13 19:39:15 | 显示全部楼层
三叶草 发表于 2020-6-13 19:30
#if SYSTEM_SUPPORT_OS   是否打开

有打开,而且也尝试直接执行OSIntEnter();  和OSIntExit();          表现一样
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-6-13 19:44:16 | 显示全部楼层
ZSCH 发表于 2020-6-13 19:39
有打开,而且也尝试直接执行OSIntEnter();  和OSIntExit();          表现一样

调试一下,看看最后跑到哪里了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 17:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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