联网智能窗帘遇到的问题求解答

做了一个联网控制的智能窗帘
移植了freeROTS上电测试后能正常运行十几秒,之后就卡死了,屏幕不动,按键也不管用

img

总共创建了三个任务,一个屏幕显示各种数据,一个控制电机,一个esp01s发送数据给云平台
找不出问题在哪
单片机用的是stm32f103c8t6,freeROTS模板是在CSDN上下载的
部分代码

uint8_t g[]="&cmd=2&uid=87d1267617024de1b6af42828dbeb1aa&topic=bishe&msg=#";
uint8_t x[]="&cmd=1&uid=87d1267617024de1b6af42828dbeb1aa&topic=bishe\r\n";
uint8_t rst[]="AT+RST\r\n";
uint8_t ping[]="ping\r\n";

#define START_TASK_PRIO        1
#define START_STK_SIZE         128  
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);

#define DJ_TASK_PRIO        2
#define DJ_STK_SIZE         50  
TaskHandle_t DJTask_Handler;
void DJ_task(void *pvParameters);

#define XH_TASK_PRIO        3
#define XH_STK_SIZE         50  
TaskHandle_t XHTask_Handler;
void XH_task(void *pvParameters);

#define WIFI_TASK_PRIO        4
#define WIFI_STK_SIZE         50  
TaskHandle_t WIFITask_Handler;
void WIFI_task(void *pvParameters);

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
    //各种模块初始化
    delay_init();
    BH1750_Init();
    OLED_Init();
    DJInit ();
    Key_Init();
    timeInit();     
    DHT_Read();
    Usart_Init();
    
    OLED_ShowHZ(2,1,135);
    OLED_ShowHZ(2,3,137);
    OLED_ShowHZ(2,5,139);
    
    Usart_SendArray(rst,sizeof(rst)); 
    //等待连上网络
    while(flag==0)
    {

                OLED_ShowHZ(2,1,135);
                OLED_ShowHZ(2,3,137);
                OLED_ShowHZ(2,5,139);
                OLED_ShowChar(2, 7, '.');
                OLED_ShowChar(2, 8, ' ');
                OLED_ShowChar(2, 9, ' ');
                OLED_ShowChar(2, 11, ' ');
                Delay_ms(200);    OLED_ShowChar(1, 1, '.');
                OLED_ShowChar(2, 7, '.');
                OLED_ShowChar(2, 9, '.');
                OLED_ShowChar(2, 11, ' ');        
                Delay_ms(200);    OLED_ShowChar(1, 2, '.');
                OLED_ShowChar(2, 7, '.');
                OLED_ShowChar(2, 9, '.');
                OLED_ShowChar(2, 11, '.');
                Delay_ms(200);    OLED_ShowChar(1, 3, '.');

    }
//连上网络发送at指令    
      espinit();
    
    OLED_Clear();

    
    xTaskCreate((TaskFunction_t )start_task,            
                (const char*    )"start_task",         
                (uint16_t       )START_STK_SIZE,       
                (void*          )NULL,               
                (UBaseType_t    )START_TASK_PRIO,     
                (TaskHandle_t*  )&StartTask_Handler);        
    vTaskStartScheduler();          
}


void start_task(void *pvParameters)
{

    
    
    taskENTER_CRITICAL();         
  
    xTaskCreate((TaskFunction_t )DJ_task,         
                (const char*    )"DJ_task",       
                (uint16_t       )DJ_STK_SIZE, 
                (void*          )NULL,                
                (UBaseType_t    )DJ_TASK_PRIO,    
                (TaskHandle_t*  )&DJTask_Handler);   
    
    xTaskCreate((TaskFunction_t )XH_task,     
                (const char*    )"XH_task",   
                (uint16_t       )XH_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )XH_TASK_PRIO,
                (TaskHandle_t*  )&XHTask_Handler); 

      xTaskCreate((TaskFunction_t )WIFI_task,     
                (const char*    )"WIFI_task",   
                (uint16_t       )WIFI_STK_SIZE, 
                (void*          )NULL,
                (UBaseType_t    )WIFI_TASK_PRIO,
                (TaskHandle_t*  )&WIFITask_Handler);    
vTaskDelete(StartTask_Handler);                        
   taskEXIT_CRITICAL(); 

}

//控制电机
void DJ_task(void *pvParameters)
{
    while(1)
    {                  //根据定时设定的时间判断是否关闭窗帘
            if(kflag==1)
            {
                DJK();
                kflag=0;
            }
            if(gflag==1)
            {
                DJG ();
                gflag=0;
            }
            //在白天时间段判断光强,改变窗帘状态
            if(h>4 && h<20 && hflag!=h)
            {
                if(BH1750_Read_Data()DJK();

                if(BH1750_Read_Data()>upper_limit)
                DJG ();
            }    
                      //手机发送数据控制窗帘
            if(kg==1)
            {DJK ();kg=3;hflag=h;}
            if(kg==0)
            {DJG ();kg=3;hflag=h;}
            
            vTaskDelay(100);
    }
}   

//屏幕显示,包括按键功能
void XH_task(void *pvParameters)
{
    while(1)
    {
            DHT_Read();
            xianshi();
            vTaskDelay(100);
    }
}
//esp01s向云平台发送数据
void WIFI_task(void *pvParameters)
{
  uint8_t i=0;
    while(1)
    {
            light=BH1750_Read_Data();
            Usart_SendArray1(g, sizeof(g),dat[0],dat[2],light,M);//发送温湿度,光强,窗帘状态等数据
            vTaskDelay(500);
            i++;
            if(i>100)
            {
                Usart_SendArray(ping,sizeof(ping));//一段时间发送一次心跳指令
                i=0;
                
            }

}

我个人感觉问题可能出在esp01那一块,是不是网络不好导致esp01s发送过数据没有及时反馈cmd=2&res=1就又发送一次数据导致数据卡顿,或者是我的代码有问题,还是对freerote用发上有问题,各位帮帮忙,分析一下问题所在。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^