STM32 EC200 物联网项目实操 第2篇 FTP OTA升级_ftp 服务器ota升级-程序员宅基地

技术标签: stm32  STM32 BOOT  单片机开发教程  物联网  嵌入式硬件  OTA  STM32引导程序  EC200  

 背景:

做了个物联网项目,需要做个OTA升级,程序分为两部分,一部分是BOOT引导程序,一部是主程序,在BOOT引导程序里面实现了和EC200 4G模块通讯,和FTP服务器通讯,获取OTA升级BIN文件。主程序里有和服务器通讯并获取服务器下发的OTA升级指令功能。

摘要:

记录了STM32F0系统单片机 BOOT引导程序通过4G模块进行OTA升级的实操过程  

使用EC200 4G物联网模块,使用MD5算法校验OTA升级文件正确性。BOOT实现了FTP服务器OTA bin文件获取,跳转APP主程序的功能。

运行开发环境介绍

硬件环境

STM32F091CBT6

J-LINK  V11

软件开发环境

IAR 8.32.1 

VSCODE 

STM32 CUBE

软件支持包 ST HAL库
4G模块         EC200N-CN

具体实现

STM32内部FLASH分配

程序运行流程:

BOOT程序读取EEPROM芯片中存储的OTA结构体变量信息。

需要OTA的话,则连接OTA信息结构体中读取FTP服务器URL和用户名和密码

访问FTP服务器,读取升级BIN文件到本地EEPROM,然后计算MD5值,判断MD5值是否和OTA信息结构体中的一样,如果一样则将BIN文件写入到STM32内部FLASH中,然后执行IAP跳转,程序跳转到主程序执行。

程序运行流程图:

OTA信息包是在主程序中,由服务器下发给单片机的,校验后存储在EEPROM芯片中

部分代码:

 main.c程序代码:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *             
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "iwdg.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stm32f0xx_hal.h"
#include "EC200N.h"

// #include "RN8302_Drv.h"
// #include "SEGGER_RTT.h"
// #include "CloudDataProtocol.h"
#include "publics.h"
#include "data.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint16_t      g_u16_CMD       = 0xff;


float         g_f_tempvalue   = 30.0f;
float         g_f_test        = 220.0f;

uint8_t       gu8_Sta =0;

uint8_t       gu8_temp=0;
uint8_t       gu8_index=0;



/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/
  
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
  
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  
  /* USER CODE END SysInit */
  
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_IWDG_Init();
  MX_USART1_UART_Init();
  MX_USART4_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  //HAL_GPIO_WritePin(GPIOB,MCU_RST_8302B_Pin,GPIO_PIN_RESET);
  HAL_GPIO_WritePin(RESET_4G_GPIO_Port,RESET_4G_Pin,GPIO_PIN_RESET);
  HAL_GPIO_WritePin(POWERKEY_4G_GPIO_Port,POWERKEY_4G_Pin,GPIO_PIN_RESET);

  HAL_GPIO_WritePin(POWERKEY_4G_GPIO_Port,POWERKEY_4G_Pin,GPIO_PIN_SET);
       
  HAL_Delay(500); 
  MX_FEED_IWDG();
  HAL_Delay(500); 
  MX_FEED_IWDG();  
  HAL_Delay(500); 
  MX_FEED_IWDG();
  HAL_Delay(500); 
  MX_FEED_IWDG();    
  

  SEGGER_RTT_Init();
  Sys_BaseTimeInit();
  DEBUG_printf(DEBUG_UART,"BOOT starting\r\n");
  DEBUG_printf(DEBUG_UART,"BOOT read stBoot2\r\n");  

  DEBUG_printf(DEBUG_UART,"BOOT _SystemParameters_TypeDef size = %d\r\n",sizeof(_SystemParameters_TypeDef));  
  DEBUG_printf(DEBUG_UART,"BOOT _MTRInitParmType_Def      size = %d\r\n",sizeof(_MTRInitParmType_Def));    
  DEBUG_printf(DEBUG_UART,"BOOT _Boot2StatusType_Def      size = %d\r\n",sizeof(_Boot2StatusType_Def));      
  
  
  // gs_TCPRecInfoOTA.u16_FLG = M_SYS_OTA_FLA;
  // FRAM_Write(Sys_OTAParmAddr,&gs_TCPRecInfoOTA,sizeof(_TcpRecvCMDInfo_OTA));      
  
  FRAM_Read(&stBoot2, Sys_BOOT2ParmAddr, sizeof(_Boot2StatusType_Def));
  FRAM_Read(&stBoot2_temp, Sys_BOOT2ParmAddr, sizeof(_Boot2StatusType_Def));  

  gu8_Sta = F_CMP_DATA(&stBoot2,&stBoot2_temp,sizeof(_Boot2StatusType_Def));
  
  if( SUCCESS!=gu8_Sta)
  {
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2  != stBoot2_temp \r\n");    
  }


  
  if( M_SYS_OTA_FLA  == stBoot2.u16_FLG)
  {
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 u16_FLG %x\r\n",stBoot2.u16_FLG);       
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 is valid\r\n");  
      
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 FilePath %s\r\n",stBoot2.FilePath);  
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 ServerDMN %s\r\n",stBoot2.ServerDMN);  
      
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 FileName %s\r\n",stBoot2.FileName);          
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 UserName %s\r\n",stBoot2.UserName);         
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 PassWord %s\r\n",stBoot2.PassWord);       
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 Md5Value %s\r\n",stBoot2.Md5Value);                                         
      
      // DEBUG_printf(DEBUG_UART,"BOOT stBoot2 u16_OTA_URL_LEN %d\r\n",gs_TCPRecInfoOTA.u16_OTA_URL_LEN);             
      // DEBUG_printf(DEBUG_UART,"BOOT stBoot2 ucA_OTA_URL %s\r\n",gs_TCPRecInfoOTA.ucA_OTA_URL);   
      // DEBUG_printf(DEBUG_UART,"BOOT stBoot2 u16_OTA_MD5_LEN %d\r\n",gs_TCPRecInfoOTA.u16_OTA_URL_LEN);             
      // DEBUG_printf(DEBUG_UART,"BOOT stBoot2 ucA_FILE_MD5 %s\r\n",gs_TCPRecInfoOTA.ucA_FILE_MD5);    

      APP_EC20Link_Init();

      gs_DecCmd.SysCmd = M_OTA_NEED_UP;
  }
  else
  {
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 u16_FLG %x\r\n",stBoot2.u16_FLG);            
      DEBUG_printf(DEBUG_UART,"BOOT stBoot2 is invalid\r\n");        
      gs_DecCmd.SysCmd = M_OTA_JUMP;
  }
  
  //QUEUE_StructCreate(&UpMachComCmdQue,(uint8_t *)UpMachComBuffer,sizeof(UpMachComBuffer),sizeof(_UpComCmdDataPacket));
  
  // F_DataSYNInit();
  // ReadRn8002CalREGData();
  
  

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 2);//huart1��Ҫ������������޸�?
    Sys_BaseTimeUpdate();
    if(gu8_debug)
    {
        MX_FEED_IWDG();   
    }
    
    if( g_SysBaseTime.f200ms ==1 )
    {
        HAL_GPIO_TogglePin(GPIOB,LED_PCB_Pin);
      //(DEBUG_RTT,"DEBUG_printf %d\r\n",Sys_GetSec());      
    }
    
    if( M_OTA_NEED_UP  ==  gs_DecCmd.SysCmd)
    {
        if( g_SysBaseTime.f200ms ==1 )
        {
            F_EC200N_RecvDatStaHandle(&g_u16_EC20CMD,&g_u16_EC20_STA);  
            F_APP_EC200N(&g_u16_EC20CMD,&g_u16_EC20_STA);              
        }
    }
    else if( M_OTA_JUMP  ==  gs_DecCmd.SysCmd)
    {
        APP_UpGrade_JumpOut();
    }
    else
    {

    }
    
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL4;
  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
int fputc(int ch, FILE *f)
{
    HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 2);//huart1
    return ch;    
}

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
    
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 程序跳转的实现:

#include "Upgrade.h"

_IapFunc_Def Jump2Sector;
/******************************************************************************
* Name		: APP_UpGrade_JumpOut
* brief		: This function is used to quit the boot.
* param		: None
* retval	: BSP status
*******************************************************************************/
FuncState APP_UpGrade_JumpOut(void)
{
	FuncState ret = FAIL;
	static uint32_t u32UPDTiming = 0;
	
	// if((TRUE == stUPDJumpFlag)
	// && (TRUE == InitFlag)
	// && (0 == stBoot.UPD_ATRB.ErrCode)
	// &&((1 == u8WifiUpdataInit)
	// ||(0xff == u8WifiUpdataInit))
	// &&(1 == g_u8SendFlag)
	// )
	{
		u32UPDTiming++;
		if(UPGRADE_REBOOT_CNTDOWN <= u32UPDTiming)
		{
			//APP_UpGrade_StartUpBeep(0x000FFFFF);
			
			//BSP_DeInit();
                        BSP_UART_DeInit();
			
			MX_FEED_IWDG();		
			/* 屏蔽所有中断,防止在跳转过程中,中断干扰出现异常 */
			__disable_irq();	
			
			Jump2Sector = (_IapFunc_Def)*(uint32_t*)(APP_ADDR + 4);
			__set_MSP(*(__IO uint32_t*)(APP_ADDR));
			Jump2Sector();
			while(1)
			{
				u32UPDTiming++;
			}
		}
	}
	
	// else
	// {
	// 	u32UPDTiming = 0;
	// }
	
	return ret;
}





#ifndef _UPGRADE_H_
#define _UPGRADE_H_
//#include "data.h"
#include "publics.h"


#define UPGRADE_REBOOT_CNTDOWN 200 

typedef void(*_IapFunc_Def)(void);




FuncState APP_UpGrade_JumpOut(void);

#endif

EC200N.c

#include "publics.h"
//#include "EC200N.H"
#include "usart.h"
#include "iwdg.h"


static ValueState st_EC20RecvCmd;
static ValueState st_EC20RestCmd;
static ValueState st_EC20DownloadCmd;

static uint32_t m_u8_EC20SendLenth;
static uint32_t m_u8_EC20RecvLenth;

_ProcVariableAllType_Def        st_EC20LinkVar;






uint16_t gu16_SendLen =0;
char Sendbuf[EC20_SEND_BUFF_SIZE];
//uint8_t RecvBuf[EC20_SEND_BUFF_SIZE];

uint32_t  g32_NowSec  = 0;
uint32_t  g32_LastSec = 0;
uint32_t  g32_DiffSec = 0;

_TcpRecvCMDInfo_OTA             gs_TCPRecInfoOTA;

_Boot2StatusType_Def            stBoot2;
_Boot2StatusType_Def            stBoot2_temp;

ErrorStatus F_OpenEC200N(void)
{
    //GPIO操作
    return 0;
}

// char PalodTest[50] ="{"type":"variant_data","version":"1.0","time":1638766638000,"params":{"Reg1":19.5}}";

// ErrorStatus F_TestEC200N(uint8_t *cmd)
// {
//     // scanf("%s",buf);
    
//     uint8_t lu8_cmd =0;
//     lu8_cmd = (uint8_t)(*cmd);
//     memset(&Sendbuf[0],0x00,sizeof(Sendbuf));
//     // sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");  
    
//     switch (lu8_cmd)
//     {
//     case 0:
//         return 1;
//         break;
//     case 1:
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT");  
//         break;
//     case 2:
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","ATI");  
//         break;       
//     case 3://查询SIM卡
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");  
//         break;      
//     case 4://查询信号,31最大,小于10证明信号超级不好
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CSQ");  
//         break;      
//     case 5://查询PS注册情况,注册则返回1,证明获取IP,可以进行网络使用啦
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGREG?");  
//         break;         
//     case 6://附着网络是否成功
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGATT?");  
//         break;    
//     case 7://设置数据格式
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCFG=\"recv/mode\",0,0,1");  
//         break;   

//     case 8://打开工业物联网云端口
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006");  
//         break;   
    
//     case 9://这步执行成功后,设备应该在线了。
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCONN=0,\"SMETTest\",\"SMETTest\",\"123456\"");  
//         break;          
//     case 10://发送数据命令
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTPUBEX=0,0,0,0,\"sys/device/SMETTest/variant_data\",85");  
//         gu16_SendLen = strlen(Sendbuf);
//         MX_FEED_IWDG();   
//         HAL_UART_Transmit(&hUART_4G, (uint8_t *)&Sendbuf,61, 0xffff);//huart1需要根据你的配置修改
//         MX_FEED_IWDG();   
//         MX_FEED_IWDG(); 
//         HAL_Delay(800);  
        
//         memset(&Sendbuf[0],0x00,sizeof(Sendbuf));
//         sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");   
//         gu16_SendLen = strlen(Sendbuf);        
//         HAL_UART_Transmit(&hUART_4G, (uint8_t *)&Sendbuf,87, 0xffff);//huart1需要根据你的配置修改
//         (*cmd) = 0;           
//         return 1;
//         break;    

//     case 11://Paload数据
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");  
//         break;      

//     case 20://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=0");  
//         break;    
        
//     case 21://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=1");  
//         break;   

//     case 22://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=2");  
//         break;   

//     case 23://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=3");  
//         break;           
        
//     case 24://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=4");  
//         break;    

//     case 25://清除链接
//         /* code */
//         sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=5");  
//         break;  

//     case 26://清除链接
//         /* code */
//         // F_DataPacking_SUNKUN_1(); 
//         break;          
                        
//     default:
//         break;
//     }       
    
//     MX_FEED_IWDG();   
//     HAL_UART_Transmit(&hUART_4G, (uint8_t *)&Sendbuf,86, 0xffff);//huart1需要根据你的配置修改
//     (*cmd) = 0;        
// }

/*
    M_4G_IDLE   
    M_AT_TESTING   
    M_AT_TEST_OK 
    M_AT_TEST_ERR
    M_SIM_CHECKING
    M_SIM_CHECK_OK
    M_SIM_CHECK_ERR
    M_CSQ_CHECKING
    M_CSQ_CHECK_OK
    M_CGREG_CHECKING
    M_CGREG_CHECK_OK
    M_CGREG_CHECK_ERR
    M_CGATT_CHECKING
    M_CGATT_CHECK_OK
    M_CGATT_CHECK_ERR
    M_QMTCFG_SETTING
    M_QMTCFG_SET_OK
    M_QMTCFG_SET_ERR
    M_QMTOPEN_OPENING
    M_QMTOPEN_OPEN_OK
    M_QMTOPEN_OPEN_ERR

    M_QMTCONN_CONNING
    M_QMTCONN_CONN_OK
    M_QMTCONN_CONN_ERR   

    M_QMTPUBEX_PUBING
    M_QMTPUBEX_PUB_OK
    M_QMTPUBEX_PUB_ERR        

*/

#define M_MIN_TCP_DP_LEN 20
#define M_CommSecRecvBufLen  1024



uint32_t u32cnt= 0;

//  m_u8_EC20RecvBuff     替换位  ArryBuf  
uint8_t  m_u8_EC20RecvBuff[EC20_RECV_BUFF_SIZE]= {0};
enum_4G_CMD gLastCMD = 0;
enum_4G_CMD gSavedLastCMD = 0;  //可手动保存一下CMD状态 等着跳回时使用
enum_4G_CMD gLastSTA = 0;
enum_4G_CMD gSavedLastSTA = 0;  //可手动保存一下STA状态 等着跳回时使用

uint8_t     gu8_TCPDirTransfMode = 0; //1为透传模式  

// typedef struct
// {    
//     uint32_t u32_RcvLen ;         // 总的TCP  len长度  
//     uint32_t u32_RcvIdleLen;     // TCP 接收二级缓存 空余的长度  
//     uint32_t u32_UsedLen ;        //有效的TCP  DP len 长度  从HEADER头开始的长度
//     int      i32_HeaderIndex ;     //查找到的TCP通讯header的索引ID    
//     uint32_t gu32_EndIndex ;       //查找到的TCP通讯末尾+1的索引ID 
//     uint8_t  gu8ParseSta;         //1 第一阶段 寻找到了包头 接下来找    
// }_CommRecvVar;  

_CommRecvVar    gs_TCPCOMM;

// uint32_t gu32_TCPRcvLen =0;         // 总的TCP  len长度  
// uint32_t gu32_TCPRcvIdleLen =0;     // TCP 接收二级缓存 空余的长度  
// uint32_t gu32_TCPUsedLen =0;        //有效的TCP  DP len 长度  从HEADER头开始的长度
// int      g32_TCPHeaderIndex =0;     //查找到的TCP通讯header的索引ID    
// uint32_t gu32_TCPEndIndex =0;       //查找到的TCP通讯末尾+1的索引ID 
// uint8_t  gu8TCPRecvSta = 0;         //1 第一阶段 寻找到了包头 接下来找
LUnion          LU_TCP_LEN;

ErrorStatus F_EC200N_RecvDatStaHandle(enum_4G_CMD *cmd,enum_4G_CMD *status)
{
    char    str_OK[] = "OK";
    char    *pch =NULL;

    ErrorStatus lerr = SUCCESS;
    
    uint32_t lu32_cmd =0 ,lu32_status = 0;
    lu32_cmd = (uint32_t)(*cmd);  
    lu32_status = (uint32_t)(*status); 
    u32cnt = UART_4G_fifo_cnt(); 
    {
        
        memset(&m_u8_EC20RecvBuff,0,sizeof(m_u8_EC20RecvBuff));
        if( u32cnt > (sizeof(m_u8_EC20RecvBuff)-2)) 
        {
            UART_4G_read(&m_u8_EC20RecvBuff,sizeof(m_u8_EC20RecvBuff));
            m_u8_EC20RecvLenth = sizeof(m_u8_EC20RecvBuff);
            //ERR
            DEBUG_printf(DEBUG_UART,"EC200 ERR %s%d \r\n",__FILE__,__LINE__);
            return ERROR;
        }
        else if(u32cnt>0)
        {
            m_u8_EC20RecvLenth = u32cnt;
            UART_4G_read(&m_u8_EC20RecvBuff,u32cnt);
            DEBUG_printf(DEBUG_UART,"EC200_UART_RECV :%s\r\n",m_u8_EC20RecvBuff);
			st_EC20RecvCmd = TRUE;            
        }
        else if( 0 == u32cnt)
        {
            // if( 1 == g_SysBaseTime.f2s)
            // {
            //     (*status) += 2;
            // }
        }
    }
}

ErrorStatus F_APP_EC200N(enum_4G_CMD *cmd,enum_4G_CMD *status)
{

	// _ProcJumpType_Def ret = PROC_JUMP_HOLD;
	// _ProcParmType_Def tempProcParm = *pProcParm;
	static char *retStr	    = NULL;
	static char *retStr1    = NULL;    
	static char *retHeader  = NULL;
	static char *retTail	= NULL;

	char *retStrHead = NULL;
	char *retStrTail = NULL;

	uint16_t tempLenth = 0;    

	uint32_t u32FileLenth   = 0;
	FuncState retFunc;
	//static uint16_t s_u16_recvKeepFlag = 0;
	static uint16_t s_u16_recvFirstFlag = 0;
	static uint32_t s_u32_Revclenth = 0;
	static uint32_t s_u32_PutBufferlenth = 0;
	static uint8_t m_u8_FileRecvBuffer[EC20_RECV_BUFF_SIZE] = {0};


    ErrorStatus l_err = SUCCESS;
    
    char str_OK[] = "OK";
    char *pch =NULL;
    
    ErrorStatus lerr = SUCCESS;

    uint32_t lu32_cmd =0 ,lu32_status = 0;
    lu32_cmd = (uint32_t)(*cmd);  
    lu32_status = (uint32_t)(*status); 
        
    memset(&Sendbuf,0,sizeof(Sendbuf));
    // sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");  
    
    switch (lu32_cmd)
    {

        case M_EC20_HARD_RESET_START:
            gu8_TCPDirTransfMode =0;  //开启透传模式
            //DO IT
            DEBUG_printf(DEBUG_UART,"EC20 RESET_4G_Pin = GPIO_PIN_SET \r\n");
            HAL_GPIO_WritePin(RESET_4G_GPIO_Port,RESET_4G_Pin,GPIO_PIN_SET); 
            HAL_Delay(1000);  
            MX_FEED_IWDG(); 
            HAL_Delay(1000);  
            MX_FEED_IWDG();              
            HAL_GPIO_WritePin(RESET_4G_GPIO_Port,RESET_4G_Pin,GPIO_PIN_RESET);   
            DEBUG_printf(DEBUG_UART,"EC20 RESET_4G_Pin = GPIO_PIN_RESET \r\n");                     
            MX_FEED_IWDG();                       
            (*status) = M_EC20_HARD_RESET_ING;    
            break;

        case M_4G_IDLE:
            //DEBUG_printf(0,"M_4G_IDLE\r\n"); 
            //gu16_SendLen = strlen(Sendbuf); 
            //(*status) = M_4G_IDLE;
            //(*cmd) = 0;
          goto JUMP_STA_ING_HANDLE;
            break;
        case M_AT_TEST_START:
            gu8_TCPDirTransfMode =0;  //开启透传模式        
            /* code */
            sprintf((char*)&Sendbuf[0],"%s\r\n","AT"); 
            gu16_SendLen = strlen(Sendbuf);             
            (*status) = M_AT_TESTING;                     
            break;
        // case 2:
        //     /* code */
        //     sprintf((char*)&Sendbuf[0],"%s\r\n","ATI");  
        //     break;       
        case M_SIM_CHECK_START://查询SIM卡
            /* code */
            gu8_TCPDirTransfMode =0;  //开启透传模式               
            sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CPIN?");  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_SIM_CHECKING;                                     
            break;    
                
        case M_CSQ_CHECK_START://查询信号,31最大,小于10证明信号超级不好
            /* code */
            gu8_TCPDirTransfMode =0;  //开启透传模式               
            sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CSQ");  
            gu16_SendLen = strlen(Sendbuf)+2; 
            (*status) = M_CSQ_CHECKING;            
            break;      
        case M_CGREG_CHECK_START://查询PS注册情况,注册则返回1,证明获取IP,可以进行网络使用啦
            /* code */
            sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGREG?");  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_CGREG_CHECKING;             
            break;  

        case M_CGATT_CHECK_START://附着网络是否成功
            /* code */
            sprintf((char*)&Sendbuf[0],"%s\r\n","AT+CGATT?");  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_CGATT_CHECKING;              
            break;    
            
        case M_QIACT1_SET_START:// 激活QIACT PDP场景
            /* code */
            sprintf((char*)&Sendbuf[0],"%s\r\n",EC20_CONTEXT_PRFL);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_QIACT1_SETTING;              
            break;  
        
        case M_QUERY_QIACT_START:// 查询场景状态
            /* code */
            sprintf((char*)&Sendbuf[0],"%s\r\n",EC20_CONTEXT_INFO);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_QUERY_QIACT_ING;              
            break;                

        case M_FTP_CFG_CONTID_START :    // FTP     上下文设置   FTP CONTEX ID SET
            /* code */
            APP_EC20Link_Init();
            sprintf((char*)&Sendbuf[0],EC20_FTP_CONTEXTID,st_EC20LinkVar.u8_FtpContextID);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_CFG_CONTID_ING;              
            break;                    

        case M_FTP_CFG_ACC_START :      // ACCOUNT  设置   FTP ACCOUNT  SET
            /* code */
         
            sprintf((char*)&Sendbuf[0],EC20_FTP_ACCOUNT,
                                                    &st_EC20LinkVar.s_FtpUserName[0],
                                                    &st_EC20LinkVar.s_FtpUserPassword[0]);            
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_CFG_ACC_ING;   
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_CFG_ACC_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_CFG_ACC_ING\r\n");                          
            break;                    

        case M_FTP_CFG_FT_START :       // filetype  设置   FTP filetype  SET
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_FILE_TYPE,st_EC20LinkVar.u8_FtpFileType); 
            
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_CFG_FT_ING; 
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_CFG_FT_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_CFG_FT_ING\r\n");                                    
            break;     

        case M_FTP_CFG_TM_START :       // transfer mode  上下文设置   FTP transfer mode  SET
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_TRANS_MODE,st_EC20LinkVar.u8_FtpTransMode);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_CFG_TM_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_CFG_TM_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_CFG_TM_ING\r\n");                                      
            break;                 
        
        case M_FTP_CFG_RSPT_START :       // rsptimeout  设置   FTP rsptimeout  SET
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_RSP_TIMEOUT,st_EC20LinkVar.u8_FtpTimeOut1S);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_CFG_RSPT_ING;    
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_CFG_RSPT_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_CFG_RSPT_ING\r\n");                                  
            break;                 

        case M_FTP_QFTPOPEN_START :       // ftp  打开   ftp  
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_OPEN,&st_EC20LinkVar.s_FtpServerDMN[0],
														st_EC20LinkVar.u16_FtpPortNum);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFTPOPEN_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFTPOPEN_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFTPOPEN_ING\r\n");                                     
            break;   

        case M_FTP_QFTPCLOSE_START :       // ftp  关闭   ftp    close
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_CLOSE);  
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFTPCLOSE_ING;   
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFTPCLOSE_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFTPCLOSE_ING\r\n");                                    
            break;  

        case M_FTP_QFTPCWD_START :       // ftp  配置 FTP(S)服务器当前目录    
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_CWD_FOLDER,&st_EC20LinkVar.s_FtpFilePath[0]);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFTPCWD_ING;    
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFTPCWD_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFTPCWD_ING\r\n");                              
            break;                              

        case M_FTP_QFTPSIZE_START :       // ftp  获取文件的大小  
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_QUERY_SIZE,&st_EC20LinkVar.s_FtpFileName[0]);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFTPSIZE_ING;   
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFTPSIZE_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFTPSIZE_ING\r\n");                                     
            break;        

        case M_FTP_QFTPGET_START :       // ftp  
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FTP_GET_FILE,
            											&st_EC20LinkVar.s_FtpFileName[0],
	    													EC20_FILE_NEW_NAME);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFTPGET_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFTPGET_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFTPGET_ING\r\n");                                  
            break;   

        case M_FTP_QFDELUFSALL_START :       // ftp  
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FILE_QFDELUFSALL);       
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFDELUFSALL_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFDELUFSALL_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFDELUFSALL_ING\r\n");                                  
            break;                        

        case M_FTP_QFOPEN_START :       // ftp  
            /* code */
		    st_EC20LinkVar.p_FileName = EC20_FILE_NEW_NAME;            
            sprintf((char*)&Sendbuf[0],EC20_FILE_OPEN,st_EC20LinkVar.p_FileName);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFOPEN_ING;    
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFOPEN_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFOPEN_ING\r\n");                                  
            break;       

        case M_FTP_QFCLOSE_START :       // ftp  
            /* code */
            sprintf((char*)&Sendbuf[0],EC20_FILE_CLOSE,st_EC20LinkVar.u16_FileHandle);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFCLOSE_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFCLOSE_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFCLOSE_ING\r\n");                                      
            break;         
        
        case M_FTP_QFSEEK_START :       // ftp  
            /* code */
            uint32_t lu32_BSP_ERR = 0;
            BSP_FLASH_Erase(0,&lu32_BSP_ERR);
            st_EC20LinkVar.u32_FilePosition = 0;
            sprintf((char*)&Sendbuf[0],EC20_FILE_SEEK,
                                                    st_EC20LinkVar.u16_FileHandle,
													st_EC20LinkVar.u32_FilePosition);
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFSEEK_ING;  
            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFSEEK_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFSEEK_ING\r\n");                                       
            break;    


        case M_FTP_QFREAD_START :       // ftp  
            /* code */

            sprintf((char*)&Sendbuf[0],EC20_FILE_READ,
													st_EC20LinkVar.u16_FileHandle,
													EC20_FILE_EXCHANGE_SIZE);            
            gu16_SendLen = strlen(Sendbuf); 
            (*status) = M_FTP_QFREAD_ING;    


            DEBUG_printf(DEBUG_UART,"CMD M_FTP_QFREAD_START\r\n");
            DEBUG_printf(DEBUG_UART,"STA M_FTP_QFREAD_ING\r\n");                                 
            break;                      

        // case M_QIOPEN_START:// OPEN EC200 TCP SOKCET 打开EC200 SOCKET
        //     /* code */
        //     gu8_TCPDirTransfMode =  M_EC20_AT;  //   进入AT模式         
        //     sprintf((char*)&Sendbuf[0],"%s\r\n",EC20_SOCKET_OPEN_TEST);  
        //     gu16_SendLen = strlen(Sendbuf); 
        //     (*status) = M_QIOPEN_ING;              
        //     break;  
            
        // case M_TCP_LOGIN_START:// LOGING 
        //     /* code */
        //     gu8_TCPDirTransfMode =  M_EC20_TT ;  //开启透传模式
        //     memset(&gs_TCPRecvLocalInfo,0,sizeof(gs_TCPRecvLocalInfo));

        //     l_err = F_TCP_LoginDataPack();
        //     if(SUCCESS == l_err)
        //     {
        //         gu16_SendLen = gs_TCP_DataPack.u32Length;
        //         memcpy(&Sendbuf,&gu8A_TCPToalDataBag,gu16_SendLen);
                
        //         (*status) = M_TCP_LOGIN_ING;                  
        //     }            
        //     break;       
        
        // case M_TCP_DATAUP_START:// TCP 数据上报开始
        //     /* code */
        //     // sprintf((char*)&Sendbuf[0],"%s\r\n",EC20_SOCKET_OPEN);  
        //     // gu16_SendLen = strlen(Sendbuf); 
        //     // (*status) = M_QIOPEN_ING;          
        //     memset(&gs_TCPRecvLocalInfo,0,sizeof(gs_TCPRecvLocalInfo));
        //     l_err = F_TCP_DataUpDataPack();
        //     if(SUCCESS == l_err)
        //     {
        //         gu16_SendLen = gs_TCP_DataPack.u32Length;
        //         memcpy(&Sendbuf,&gu8A_TCPToalDataBag,gu16_SendLen);
                
        //         (*status) = M_TCP_DATAUP_ING;                  
        //     }                
        //     break;                       
        
        // case M_QICLOSE_START:// OPEN EC200 TCP SOKCET 打开EC200 SOCKET
        //     /* code */
        //     sprintf((char*)&Sendbuf[0],"%s\r\n",EC20_SOCKET_CLOSE);  
        //     gu16_SendLen = strlen(Sendbuf); 
        //     (*status) = M_QICLOSE_ING;              
        //     break;              
        
        // case M_QMTCFG_SET_START://设置数据格式
        //     /* code */
        //     sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCFG=\"recv/mode\",0,0,1");  
        //     gu16_SendLen = strlen(Sendbuf); 
        //     (*status) = M_QMTCFG_SETTING;                
        //     break;   

        // case M_QMTOPEN_OPEN_START://打开工业物联网云端口
        //     /* code */
        //     sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTOPEN=0,\"www.sukon-cloud.com\",9006"); 
        //     gu16_SendLen = strlen(Sendbuf);              
        //     (*status) = M_QMTOPEN_OPENING;  
        //     break;   
            
        // case M_QMTCONN_CONN_START://这步执行成功后,设备应该在线了。
        //     /* code */
        //     sprintf((char*)&Sendbuf[0],"%s\r\n","AT+QMTCONN=0,\"SMETTest\",\"SMETTest\",\"123456\""); 
        //     gu16_SendLen = strlen(Sendbuf);               
        //     (*status) = M_QMTCONN_CONNING;             
        //     break;      
        
        // case M_QMTPUBEX_PUB_START://发送数据命令
        //     /* code */
        //     memset(&Sendbuf,0,sizeof(Sendbuf));   
        //     F_DataPacking_SUNKUN_1(Sendbuf,sizeof(Sendbuf));  
        //     gu16_SendLen = strlen(Sendbuf);   
        //     memset(&Sendbuf,0,sizeof(Sendbuf)); 
        //     sprintf((char*)&Sendbuf[0],"%s,%d\r\n","AT+QMTPUBEX=0,0,0,0,\"sys/device/SMETTest/variant_data\"",gu16_SendLen);  
        //     gu16_SendLen = strlen(Sendbuf);
        //     MX_FEED_IWDG();   
        //     HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);//huart1需要根据你的配置修改
        //     MX_FEED_IWDG();   
        //     MX_FEED_IWDG(); 
        //     HAL_Delay(800);  

        //     memset(&Sendbuf,0,sizeof(Sendbuf));   
        //     F_DataPacking_SUNKUN_1(Sendbuf,sizeof(Sendbuf));  
        //     gu16_SendLen = strlen(Sendbuf);                                 
            
        //     //sprintf(Sendbuf,SUNKON_PAYLOAD,gf_testUAV,gf_testUBV,gf_testUCV,gf_testIAA,gf_testIBA,gf_testICA,gf_testPAW,gf_testPBW,gf_testPCW,gf_testPTW);  

        //     //sprintf((char*)&Sendbuf[0],"%s\r\n","{\"type\":\"variant_data\",\"version\":\"1.0\",\"time\":1638766638000,\"params\":{\"UAV\":220.5}}");        
        //     HAL_UART_Transmit(&huart4, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);//huart1需要根据你的配置修改
            
        //     (*status) = M_QMTPUBEX_PUBING;          
        //     return 1;
        //     break;   
        
        // case M_QMTDISC_0_START://清除链接
        //         /* code */
        //     memset(&Sendbuf,0,sizeof(Sendbuf));                     
        //     sprintf((char*)&Sendbuf[0],"%s\r\n"," AT+QMTDISC=0"); 
        //     gu16_SendLen = strlen(Sendbuf);   
        //     (*status) = M_QMTDISC_0_ING;                         
        //         break;     

        default:
            //return ERROR;
          
            goto JUMP_STA_ING_HANDLE;
            break;
    }

    (*cmd) = (*status);
    HAL_UART_Transmit(&huart1, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);//huart1需要根据你的配置修改 
    HAL_UART_Transmit(&UART_4G, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);//hUART_4G需要根据你的配置修改 
    // memset(&g_SysBaseTime,0,sizeof(g_SysBaseTime));
    // Sys_BaseTimeInit();
    g32_LastSec = Sys_GetSec(); 

    //ING STATUS
    
JUMP_STA_ING_HANDLE:
   
   switch ( lu32_status )
    {
        
    case M_EC20_HARD_RESET_ING:

        g32_NowSec = Sys_GetSec();
        g32_DiffSec = g32_NowSec - g32_LastSec;            
        pch = strstr(m_u8_EC20RecvBuff, "RDY");        
	    if (pch != NULL)
        {
            // (*status) += 1;
            (*status)   = M_EC20_HARD_RESET_INIT_WAIT;
            (*cmd)      = M_EC20_HARD_RESET_INIT_WAIT;
             g32_LastSec = Sys_GetSec();
        }
        else if( g32_DiffSec > 10)
        {
            // (*status) += 2;
            (*status)  = M_EC20_HARD_RESET_ERR;
        }      
        break;
        
    case M_EC20_HARD_RESET_INIT_WAIT:
        //重启后的初始化等待步骤
        g32_NowSec  =   Sys_GetSec();
        g32_DiffSec =   g32_NowSec - g32_LastSec; 
        if(g32_DiffSec > M_EC20_RESET_INIT_WAIT_S) 
        {
            (*cmd)  =   M_SIM_CHECK_START;            
        }        
        break;
        
        // g32_NowSec = Sys_GetSec();
        // g32_DiffSec = g32_NowSec - g32_LastSec;        
        // pch = strstr(ArryBuf, str_OK); 
        // if (pch != NULL)
        // {
        // (*status) += 1;
        // }
        // else if( g32_DiffSec > 6)
        // {
        // (*status) += 2;
        // }       

    case M_AT_TESTING:
        pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	    if (pch != NULL)
        {
            (*status) += 1;
        }
        else if( g_SysBaseTime.f2s == 1)
        {
            (*status) += 2;
        }      
        break;

    case M_SIM_CHECKING:
        pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	    if (pch != NULL)
        {
            (*status) += 1;
        }
        else if( g_SysBaseTime.f2s == 1)
        {
            //(*status) += 2;
            (*status) = M_SIM_CHECK_ERR;
        }        
        break;      

    case M_CSQ_CHECKING:
        {
            pch = strstr(m_u8_EC20RecvBuff, str_OK);        
            if (pch != NULL)
            {
                (*status) += 1;
            }
            else if( g_SysBaseTime.f2s == 1)
            {
                (*status) += 2;
            }
            break;              
        }
        
    case M_CGATT_CHECKING:
        {
            pch = strstr(m_u8_EC20RecvBuff, str_OK);        
            if (pch != NULL)
            {
            (*status) += 1;
            }
            else if( g_SysBaseTime.f2s == 1)
            {
            (*status) += 2;
            }
            break;   
        }        

    case M_QIACT1_SETTING:
        pch = strstr(m_u8_EC20RecvBuff, EC20_CONTEXT_PRFL_ANS);        
	    if (pch != NULL)
        {
            (*status) += 1;
        }
        else if( g_SysBaseTime.f2s == 1)
        {
            (*status) += 2;
        }      
        break;        

    case M_QUERY_QIACT_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_CONTEXT_INFO_ANS);        
	    if (pch != NULL)
        {
            (*status) += 1;
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) += 2;  //M_QIOPEN_ERR
        }          
        break;      

    case M_FTP_CFG_CONTID_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_CFG_CONTID_OK;
            DEBUG_printf(DEBUG_UART,"FTP context id set ok\r\n");
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_CFG_CONTID_ERR;  //M_QIOPEN_ERR
            DEBUG_printf(DEBUG_UART,"FTP context id set timeout\r\n");                   
        }          
        break;    

    case M_FTP_CFG_ACC_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_CFG_ACC_OK;
            DEBUG_printf(DEBUG_UART,"FTP ACC set ok\r\n");            
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_CFG_ACC_ERR;  //M_QIOPEN_ERR
            DEBUG_printf(DEBUG_UART,"FTP ACC set timeout\r\n");              
        }          
        break;     

    case M_FTP_CFG_FT_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_CFG_FT_OK;
            DEBUG_printf(DEBUG_UART,"FTP file type set ok\r\n");                    
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_CFG_FT_ERR;  //M_QIOPEN_ERR
            DEBUG_printf(DEBUG_UART,"FTP file type set timeout\r\n");                    
        }          
        break;     
    
    case M_FTP_CFG_TM_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_CFG_TM_OK;
            DEBUG_printf(DEBUG_UART,"FTP transfer mode set ok\r\n");                   
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_CFG_TM_ERR;  //
            DEBUG_printf(DEBUG_UART,"FTP transfer mode set timeout\r\n");                
        }          
        break;        

    case M_FTP_CFG_RSPT_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_CFG_RSPT_OK;
            DEBUG_printf(DEBUG_UART,"FTP RSPT set ok\r\n");                        
        }
        // else if( g_SysBaseTime.f2s == 1)
        // {
        //     (*status) += 2;
        // }      
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_CFG_RSPT_ERR;  //
            DEBUG_printf(DEBUG_UART,"FTP RSPT set timeout\r\n");                           
        }          
        break;     

    case M_FTP_QFTPOPEN_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   
        // pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OPEN_ANS);        
	    // if (pch != NULL)
        // {
        //     (*status)  = M_FTP_QFTPOPEN_OK;
        // }
        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_OPEN_ANS);
            retStr1 = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_ERR);
            if(NULL != retStr)
            {
                retStrHead = retStr + sizeof(EC20_FTP_OPEN_ANS) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpLoginInfo));
                memcpy(&st_EC20LinkVar.s_FtpLoginInfo[0],retStrHead,tempLenth);
                
                retStr1 = strstr(retStrHead,",");
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpLoginInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = atoi(retStr1 + 1);
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING s_FtpLoginInfo %s\r\n",st_EC20LinkVar.s_FtpLoginInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);                                    
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status)  = M_FTP_QFTPOPEN_OK;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_OK \r\n"); 
                }
                else
                {
                    (*status)  = M_FTP_QFTPOPEN_ERR;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ERR u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);                          
                }
            }
            else if(NULL != retStr1)
            {
                retStrHead = retStr1 + sizeof(EC20_FTP_ERR) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpLoginInfo));
                memcpy(&st_EC20LinkVar.s_FtpLoginInfo[0],retStrHead,tempLenth);
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpLoginInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = 0;

                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING s_FtpLoginInfo %s\r\n",st_EC20LinkVar.s_FtpLoginInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);                                
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status)  = M_FTP_QFTPOPEN_OK;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_OK \r\n");  
                }
                else
                {
                    (*status)  = M_FTP_QFTPOPEN_ERR;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);       
                }
            }
            else
            {
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ING unknow\r\n");   
            }
        }        
        else if ( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFTPOPEN_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFTPOPEN_ERR timeout \r\n");              
        }     

        break;                                        
            
    case    M_FTP_QFDELUFSALL_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;   
        pch = strstr(m_u8_EC20RecvBuff, EC20_FTP_OK);        
	    if (pch != NULL)
        {
            (*status)  = M_FTP_QFDELUFSALL_OK;
            DEBUG_printf(DEBUG_UART,"EC20 M_FTP_QFDELUFSALL_OK ok\r\n");                        
        }     
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFDELUFSALL_ERR;  //
            DEBUG_printf(DEBUG_UART,"EC20 M_FTP_QFDELUFSALL_ERR timeout\r\n");                           
        }     
        break;


    case    M_FTP_QFTPCLOSE_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                   

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_CLOSE_ANS);
            retStr1 = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_ERR);				
            if(NULL != retStr)
            {
                retStrHead = retStr + sizeof(EC20_FTP_CLOSE_ANS) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpLogoffInfo));
                memcpy(&st_EC20LinkVar.s_FtpLogoffInfo[0],retStrHead,tempLenth);
                
                retStr1 = strstr(retStrHead,",");
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpLogoffInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = atoi(retStr1 + 1);

                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING s_FtpLogoffInfo %s\r\n",st_EC20LinkVar.s_FtpLogoffInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);                     
                //ret = PROC_JUMP_NEXT;
                (*status)  = M_FTP_QFTPCLOSE_OK;
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_OK\r\n");
            }
            else if(NULL != retStr1)
            {
                retStrHead = retStr1 + sizeof(EC20_FTP_ERR) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpLogoffInfo));
                memcpy(&st_EC20LinkVar.s_FtpLogoffInfo[0],retStrHead,tempLenth);
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpLogoffInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = 0;
                //ret = PROC_JUMP_NEXT;
                (*status)  = M_FTP_QFTPCLOSE_ERR;
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING s_FtpLogoffInfo %s\r\n",st_EC20LinkVar.s_FtpLogoffInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);   
            }
            else
            {
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING unknow\r\n");   
            }
        } 
        else if ( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFTPCLOSE_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCLOSE_ING timeout \r\n");  
        }                    

        break;  

    case M_FTP_QFTPCWD_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                       
        
        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_CWD_FOLDER_ANS);
            retStr1 = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_ERR);
            if(NULL != retStr)
            {
                retStrHead = retStr + sizeof(EC20_FTP_CWD_FOLDER_ANS) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpFolderInfo));
                memcpy(&st_EC20LinkVar.s_FtpFolderInfo[0],retStrHead,tempLenth);
                
                retStr1 = strstr(retStrHead,",");
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpFolderInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = atoi(retStr1 + 1);

                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ING s_FtpFolderInfo %s\r\n",st_EC20LinkVar.s_FtpFolderInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);   
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ING u16_FtpProErrCode %d\r\n",st_EC20LinkVar.u16_FtpProErrCode);   
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status) = M_FTP_QFTPCWD_OK;  //  
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_OK\r\n");                   
                }
                else 
                {
                    (*status) = M_FTP_QFTPCWD_ERR;  //
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ERR u16_FtpErrCode %d \r\n",st_EC20LinkVar.u16_FtpErrCode);   
                }
            }
            else if(NULL != retStr1)
            {
                retStrHead = retStr1 + sizeof(EC20_FTP_ERR) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpFolderInfo));
                memcpy(&st_EC20LinkVar.s_FtpFolderInfo[0],retStrHead,tempLenth);
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpFolderInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = 0;
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status) = M_FTP_QFTPCWD_ERR;  //                    
                }
                (*status) = M_FTP_QFTPCWD_ERR;  // 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ERR u16_FtpErrCode %s %d \r\n",EC20_FTP_ERR,st_EC20LinkVar.u16_FtpErrCode);                  
            }
        }
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFTPCWD_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFTPCWD_ING timeout \r\n");              
        }          
        break;  

    case M_FTP_QFTPSIZE_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                         

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_QUERY_SIZE_ANS);
            retStr1 = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_ERR);
            if(NULL != retStr)
            {
                retStrHead = retStr + sizeof(EC20_FTP_QUERY_SIZE_ANS) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpFileInfo));
                memcpy(&st_EC20LinkVar.s_FtpFileInfo[0],retStrHead,tempLenth);
                
                retStr1 = strstr(retStrHead,",");
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpFileInfo[0]);

                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ING s_FtpFileInfo %s\r\n",st_EC20LinkVar.s_FtpFileInfo); 
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ING u16_FtpErrCode %d\r\n",st_EC20LinkVar.u16_FtpErrCode);                   
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    st_EC20LinkVar.u32_FtpFileOriginalSize = atoi(retStr1 + 1);
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_OK u32_FtpFileOriginalSize %d\r\n",st_EC20LinkVar.u32_FtpFileOriginalSize);                       
                    //ret = PROC_JUMP_EXIT;
                    (*status)  = M_FTP_QFTPSIZE_OK;
                }
                else
                {
                    (*status)  = M_FTP_QFTPSIZE_ERR;                    
                    st_EC20LinkVar.u16_FtpProErrCode = atoi(retStr1 + 1);
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ERR u16_FtpProErrCode %d\r\n",st_EC20LinkVar.u16_FtpProErrCode);                          
                }
            }

            else if(NULL != retStr1)
            {
                retStrHead = retStr1 + sizeof(EC20_FTP_ERR) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpFileInfo));
                memcpy(&st_EC20LinkVar.s_FtpFileInfo[0],retStrHead,tempLenth);
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpFileInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = 0;
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status) = M_FTP_QFTPSIZE_ERR;  
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ERR u16_FtpErrCode CME %d \r\n",st_EC20LinkVar.u16_FtpErrCode); 
                }
                else
                {
                    (*status) = M_FTP_QFTPSIZE_ERR;  
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ERR u16_FtpErrCode CME %d \r\n",st_EC20LinkVar.u16_FtpErrCode); 
                }
            }
            else
            {
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ING unkonw\r\n"); 
            }
        } 
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFTPSIZE_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFTPSIZE_ERR timeout \r\n");                    
        }                 

        break;     
    
    case M_FTP_QFTPGET_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                      

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_GET_FILE_ANS);
            retStr1 = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FTP_ERR);
            if(NULL != retStr)
            {
                retStrHead = retStr + sizeof(EC20_FTP_GET_FILE_ANS) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpDataInfo));
                memcpy(&st_EC20LinkVar.s_FtpDataInfo[0],retStrHead,tempLenth);
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ING s_FtpDataInfo %s \r\n",st_EC20LinkVar.s_FtpDataInfo[0]); 

                retStr1 = strstr(retStrHead,",");
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpDataInfo[0]);
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ING u16_FtpErrCode %d \r\n",st_EC20LinkVar.u16_FtpErrCode);                 
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    st_EC20LinkVar.u32_FtpFileDownloadSize = atoi(retStr1 + 1);
                    //ret = PROC_JUMP_EXIT;
                    (*status)  = M_FTP_QFTPGET_OK;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_OK u32_FtpFileDownloadSize %d \r\n",st_EC20LinkVar.u32_FtpFileDownloadSize);   
                }
                else if(613 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    (*status)  = M_FTP_QFTPGET_ERR;
                    st_EC20LinkVar.u16_FtpProErrCode = atoi(retStr1 + 1);
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ERR u16_FtpProErrCode %d \r\n",st_EC20LinkVar.u16_FtpProErrCode);                       
                }
                else
                {

                }
            } //END if(NULL != retStr)

            else if(NULL != retStr1)            
            {
                retStrHead = retStr1 + sizeof(EC20_FTP_ERR) - 1;
                retStrTail = strstr(retStrHead,"\r\n");
                tempLenth = retStrTail - retStrHead;
                tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpDataInfo));
                memcpy(&st_EC20LinkVar.s_FtpDataInfo[0],retStrHead,tempLenth);
                
                st_EC20LinkVar.u16_FtpErrCode = atoi((char*)&st_EC20LinkVar.s_FtpDataInfo[0]);
                st_EC20LinkVar.u16_FtpProErrCode = 0;
                if(0 == st_EC20LinkVar.u16_FtpErrCode)
                {
                    //ret = PROC_JUMP_EXIT;
                    (*status) = M_FTP_QFTPGET_ERR;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_OK u16_FtpErrCode CME %d \r\n",st_EC20LinkVar.u16_FtpErrCode);                    
                }
                else
                {
                    (*status) = M_FTP_QFTPGET_ERR;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ERR u16_FtpErrCode CME %d \r\n",st_EC20LinkVar.u16_FtpErrCode);                       
                }

            } //END else if(NULL != retStr1)  
            else
            {
                DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ING unkonw\r\n");
            }
        } // END if(TRUE == st_EC20RecvCmd)
        else if( g32_DiffSec > 16)
        {
            (*status) = M_FTP_QFTPGET_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFTPGET_ERR timeout \r\n");                 
        }  

    case M_FTP_QFOPEN_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;     
        
        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_OPEN_ANS,
                                            &st_EC20LinkVar.s_FileOpenInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileOpenInfo));
            if(SUCC == retFunc)
            {
                st_EC20LinkVar.u16_FileHandle = atoi((char*)&st_EC20LinkVar.s_FileOpenInfo[0]);
                DEBUG_printf(DEBUG_UART,"M_FTP_QFOPEN_OK u16_FileHandle =%d\r\n",st_EC20LinkVar.u16_FileHandle); 
                (*status) = M_FTP_QFOPEN_OK;  //
                // ret = PROC_JUMP_EXIT;
            }
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_ERR,
                                            &st_EC20LinkVar.s_FileOpenInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileOpenInfo));
            if(SUCC == retFunc)
            {
                st_EC20LinkVar.u16_FileErrCode = atoi((char*)&st_EC20LinkVar.s_FileOpenInfo[0]);
                if(426 == st_EC20LinkVar.u16_FileErrCode)  //426   =  文件已经打开   file is already open
                {
                    // ret = PROC_JUMP_EXIT;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFOPEN_OK file is already open\r\n"); 
                    (*status) = M_FTP_QFOPEN_OK;  //
                }
                else 
                {
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFOPEN_ERR u16_FileErrCode = %d\r\n",st_EC20LinkVar.u16_FileErrCode);
                    (*status) = M_FTP_QFOPEN_ERR;  // 
                }
            }
        }
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFOPEN_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFOPEN_ING timeout \r\n");                 
        }          
        break;

    case M_FTP_QFCLOSE_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;     

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_OK,
                                            &st_EC20LinkVar.s_FileCloseInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileCloseInfo));
            if(SUCC == retFunc)
            {
                // ret = PROC_JUMP_EXIT;
                (*status) = M_FTP_QFCLOSE_OK;  //                           
            }
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_ERR,
                                            &st_EC20LinkVar.s_FileCloseInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileCloseInfo));
            if(SUCC == retFunc)
            {
                st_EC20LinkVar.u16_FileErrCode = atoi((char*)&st_EC20LinkVar.s_FileCloseInfo[0]);
                // ret = PROC_JUMP_EXIT;
                (*status) = M_FTP_QFCLOSE_ERR;  //                
                DEBUG_printf(DEBUG_UART,"M_FTP_QFCLOSE_ING u16_FileErrCode %d \r\n",st_EC20LinkVar.u16_FileErrCode);    
            }
        } 
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFCLOSE_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFCLOSE_ERR timeout \r\n");                 
        }                   
        break;        

    case M_FTP_QFSEEK_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;    

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_OK,
                                            &st_EC20LinkVar.s_FileCloseInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileCloseInfo));
            if(SUCC == retFunc)
            {
                (*status) = M_FTP_QFSEEK_OK;  //  
                DEBUG_printf(DEBUG_UART,"M_FTP_QFSEEK_OK  \r\n");
                // ret = PROC_JUMP_EXIT;
            }
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_ERR,
                                            &st_EC20LinkVar.s_FileCloseInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileCloseInfo));
            if(SUCC == retFunc)
            {
                st_EC20LinkVar.u16_FileErrCode = atoi((char*)&st_EC20LinkVar.s_FileCloseInfo[0]);
                (*status) = M_FTP_QFSEEK_ERR;  //   
                DEBUG_printf(DEBUG_UART,"M_FTP_QFSEEK_ERR  \r\n");                               
            }
        }
        else if( g32_DiffSec > 8)
        {
            (*status) = M_FTP_QFSEEK_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFSEEK_ERR timeout \r\n");                 
        }            
        break;

    case M_FTP_QFREAD_ING:
        g32_NowSec = Sys_GetSec();  
        g32_DiffSec = g32_NowSec - g32_LastSec;                       

        if(TRUE == st_EC20RecvCmd)
        {
            st_EC20RecvCmd = FALSE;
            
            if(0 == s_u16_recvFirstFlag)	
            {                
                retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_RW_ANS,
                                                &st_EC20LinkVar.s_FileReadInfo[0],
                                                sizeof(st_EC20LinkVar.s_FileReadInfo));
                if(NULL == retFunc)
                {
                    m_u8_EC20RecvLenth = 0;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING retFunc = NULL \r\n");   
                }
                else if(SUCC == retFunc)
                {
                    st_EC20LinkVar.u16_FileTransLen = atoi((char*)&st_EC20LinkVar.s_FileReadInfo[0]);

                    retHeader = (char*)&m_u8_EC20RecvBuff[0];
                    
                    retStr = strstr((char*)&m_u8_EC20RecvBuff[0],EC20_FILE_RW_ANS);//GET

                    retStr = strstr(retStr,"\r\n");

                    retTail = retStr + strlen("\r\n");

                    u32FileLenth = retTail - retHeader;
                    
                    m_u8_EC20RecvLenth -=  u32FileLenth;
                    
                    s_u16_recvFirstFlag = 1;
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING st_EC20LinkVar.u16_FileTransLen %d\r\n",st_EC20LinkVar.u16_FileTransLen); 
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING u32FileLenth %d\r\n",u32FileLenth);      
                    DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING m_u8_EC20RecvLenth %d\r\n",m_u8_EC20RecvLenth);                                                                                    
                }				
            }
            
            if(m_u8_EC20RecvLenth >= (st_EC20LinkVar.u16_FileTransLen + 6 - s_u32_Revclenth))
            {
                s_u32_PutBufferlenth = st_EC20LinkVar.u16_FileTransLen - s_u32_Revclenth;
            }
            else
            {
                s_u32_PutBufferlenth = m_u8_EC20RecvLenth;
            }

            memcpy(&m_u8_FileRecvBuffer[s_u32_Revclenth],&m_u8_EC20RecvBuff[u32FileLenth],s_u32_PutBufferlenth);

            s_u32_Revclenth += s_u32_PutBufferlenth; 

            DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING s_u32_PutBufferlenth %d\r\n",s_u32_PutBufferlenth);  
            DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING s_u32_Revclenth %d\r\n",s_u32_Revclenth);              
            
            if(s_u32_Revclenth == st_EC20LinkVar.u16_FileTransLen)
            {
                retHeader = (char*)&m_u8_EC20RecvBuff[u32FileLenth] + s_u32_PutBufferlenth;
                retStr = strstr(retHeader,"\r\nOK\r\n");
                
                if(NULL != retStr)
                {
                    DEBUG_printf(DEBUG_UART,"BSP_FLASH_Write st_EC20LinkVar.u32_FilePosition  %d\r\n",st_EC20LinkVar.u32_FilePosition); 
                    
                    if(BSP_OK == EE_Write_CHECK((st_EC20LinkVar.u32_FilePosition + EE_OTAFileAddr),

                    
                                        (uint16_t*)m_u8_FileRecvBuffer,
                                        (st_EC20LinkVar.u16_FileTransLen )));

                    {
                        DEBUG_printf(DEBUG_UART,"EE_Write_CHECK over  %d\r\n",st_EC20LinkVar.u16_FileTransLen);                             
                        s_u16_recvFirstFlag	= 0;
                        s_u32_Revclenth		= 0;
                        s_u32_PutBufferlenth= 0;
                        memset(&m_u8_FileRecvBuffer[0],0,EC20_RECV_BUFF_SIZE);		
                        //ret = PROC_JUMP_NEXT;
                        (*status)   = M_FTP_QFREAD_ING1; 
                        (*cmd)      = M_FTP_QFREAD_ING1;                        
                    }



                    // if(BSP_OK == BSP_FLASH_Write((st_EC20LinkVar.u32_FilePosition + APP_ADDR),
                    //                     (uint16_t*)m_u8_FileRecvBuffer,
                    //                     (st_EC20LinkVar.u16_FileTransLen >> 1) + (st_EC20LinkVar.u16_FileTransLen % 2)));
                    // {					
                    //     DEBUG_printf(DEBUG_UART,"BSP_FLASH_Write over  %d\r\n",st_EC20LinkVar.u16_FileTransLen);                             
                    //     s_u16_recvFirstFlag	= 0;
                    //     s_u32_Revclenth		= 0;
                    //     s_u32_PutBufferlenth= 0;
                    //     memset(&m_u8_FileRecvBuffer[0],0,EC20_RECV_BUFF_SIZE);		
                    //     //ret = PROC_JUMP_NEXT;
                    //     (*status)   = M_FTP_QFREAD_ING1; 
                    //     (*cmd)      = M_FTP_QFREAD_ING1;
                    // }
                }
            }				
            
            retFunc = Alg_EC20Link_ParseInfo(EC20_FILE_ERR,
                                            &st_EC20LinkVar.s_FileReadInfo[0],
                                            sizeof(st_EC20LinkVar.s_FileReadInfo));
            if(SUCC == retFunc)
            {
                st_EC20LinkVar.u16_FileErrCode = atoi((char*)&st_EC20LinkVar.s_FileReadInfo[0]);
                s_u16_recvFirstFlag		= 0;
                s_u32_Revclenth			= 0;
                s_u32_PutBufferlenth	= 0;
                memset(&m_u8_FileRecvBuffer[0],0,EC20_RECV_BUFF_SIZE);
            }
        } //END if(TRUE == st_EC20RecvCmd)
        else if( g32_DiffSec > 13)
        {
            (*status) = M_FTP_QFSEEK_ERR;  //
            DEBUG_printf(DEBUG_UART,"M_FTP_QFREAD_ING timeout \r\n");                 
        }            
        break;
        
    case M_FTP_QFREAD_ING1:        
        st_EC20LinkVar.u32_FilePosition += st_EC20LinkVar.u16_FileTransLen;
        st_EC20LinkVar.u32_FileSaveSize += st_EC20LinkVar.u16_FileTransLen;

        if(st_EC20LinkVar.u32_FtpFileDownloadSize <= st_EC20LinkVar.u32_FileSaveSize)
        {
            //ret = PROC_JUMP_EXIT;
            DEBUG_printf(DEBUG_UART,"PROC_JUMP_EXIT \r\n");
            DEBUG_printf(DEBUG_UART,"u32_FtpFileDownloadSize %d  u32_FileSaveSize  %d\r\n",
                st_EC20LinkVar.u32_FtpFileDownloadSize,st_EC20LinkVar.u32_FileSaveSize);      
            (*status)   = M_FTP_QFREAD_OK; 
            (*cmd)      = M_FTP_QFREAD_OK;                              
        }
        else
        {
            // tempProcParm.Flag = PROC_FLAG_BUSY0;
            (*status)   = M_FTP_QFREAD_START; 
            (*cmd)      = M_FTP_QFREAD_START;      
            DEBUG_printf(DEBUG_UART,"u32_FtpFileDownloadSize %d  u32_FileSaveSize  %d\r\n",
                st_EC20LinkVar.u32_FtpFileDownloadSize,st_EC20LinkVar.u32_FileSaveSize);                  
        }
    
        break;

        //static ValueState st_EC20RecvCmd;


    // case M_QIOPEN_ING:
    //     g32_NowSec = Sys_GetSec();
    //     g32_DiffSec = g32_NowSec - g32_LastSec;         
    //     pch = strstr(m_u8_EC20RecvBuff, EC20_SOCKET_OPEN_ANS);        
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;  //M_QIOPEN_OK
    //     }
    //     else if( g32_DiffSec > 30)
    //     {
    //         (*status) += 2;  //M_QIOPEN_ERR
    //     }  
    //     pch = strstr(m_u8_EC20RecvBuff, EC20_SOCKET_OPEN_ANS_ERR);      
	//     if (pch != NULL)
    //     {
    //         (*status) += 2;  //M_QIOPEN_ERR
    //     }
    //     break;    

        // g32_NowSec = Sys_GetSec();
        // g32_DiffSec = g32_NowSec - g32_LastSec;            
        // pch = strstr(ArryBuf, "RDY");        
	    // if (pch != NULL)
        // {
        //     (*status) += 1;
        // }
        // else if( g32_DiffSec > 6)
        // {
        //     (*status) += 2;
        // }      
        // break;          
        
    // case M_QICLOSE_ING:
    //     pch = strstr(m_u8_EC20RecvBuff, EC20_SOCKET_CLOSE_ANS);        
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g_SysBaseTime.f2s == 1)
    //     {
    //         (*status) += 2;
    //     }      
    //     break;     
        
    // case M_TCP_LOGIN_ING:
        
    //     if(M_TCP_COMM_PKTYPE_LOGIN_ACK  == gs_TCPRecvLocalInfo.u32PK_Type)
    //     {
    //         (*status) = M_TCP_LOGIN_OK;
    //     }
    //     else if( g_SysBaseTime.f6s == 1)
    //     {
    //         //(*status) += 2;
    //         (*status) = M_TCP_LOGIN_ERR;
    //     }         
    //     memset(&gs_TCPRecvLocalInfo,0,sizeof(gs_TCPRecvLocalInfo));
	//     //  if (pch != NULL)
    //     // {
    //     //     (*status) += 1;
    //     // }
    //     // else if( g_SysBaseTime.f2s == 1)
    //     // {
    //     //     (*status) += 2;
    //     // }      
    //     break;   

    // case M_TCP_DATAUP_ING:

    //     // pch = strstr(ArryBuf, EC20_SOCKET_CLOSE_ANS);    


	//     // if (pch != NULL)
    //     // {
    //     //     (*status) += 1;
    //     // }
    //     // else if( g_SysBaseTime.f2s == 1)
    //     // {
    //     //     (*status) += 2;
    //     // }   
        
    //     if(M_TCP_COMM_PKTYPE_DATAUP_ACK  == gs_TCPRecvLocalInfo.u32PK_Type)
    //     {
    //         (*status) = M_TCP_DATAUP_OK;
    //     }
    //     else if( g_SysBaseTime.f6s == 1)
    //     {
    //         //(*status) += 2;
    //         (*status) = M_TCP_DATAUP_ERR;
    //     }         
    //     memset(&gs_TCPRecvLocalInfo,0,sizeof(gs_TCPRecvLocalInfo));

    //     //临时调试:
    //     // (*status) = M_TCP_CIRCY_SEND_WAIT;
    //     // (*cmd) = M_TCP_CIRCY_SEND_WAIT;
    //     break; 
                
    // case M_QMTCFG_SETTING:
    //     pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g_SysBaseTime.f2s == 1)
    //     {
    //         (*status) += 2;
    //     }      
    //     break;      
           
    // case M_QMTOPEN_OPENING:
    //     g32_NowSec = Sys_GetSec();
    //     g32_DiffSec = g32_NowSec - g32_LastSec;        
    //     pch = strstr(m_u8_EC20RecvBuff, str_OK); 
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g32_DiffSec > 6)
    //     {
    //         (*status) += 2;
    //     }       
    //     break;    

    // case M_QMTCONN_CONNING:
    //     pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g_SysBaseTime.f2s == 1)
    //     {
    //         (*status) += 2;            
    //     }       
    //     break;                          

    // case  M_QMTPUBEX_PUBING:
    //     pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	//     if(pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g_SysBaseTime.f2s == 1)
    //     {
    //         (*status) += 2;
    //     }       
    //     break;     
    
    // case M_QMTDISC_0_ING:
    //     pch = strstr(m_u8_EC20RecvBuff, str_OK);        
	//     if (pch != NULL)
    //     {
    //         (*status) += 1;
    //     }
    //     else if( g_SysBaseTime.f2s == 1)
    //     {
    //         (*status) += 2;
    //     }       
    //     break;  
        
    default:
        lu32_status = (uint32_t)(*status);         
        //DEBUG_printf(0,"EC200N status = %u NO CHANGE \r\n",lu32_status);
        goto JUMP_CMD_RES_HANDEL;
        break;
    }

    lu32_status = (uint32_t)(*status); 

    if(gLastSTA != lu32_status)
    {
        DEBUG_printf(DEBUG_UART,"EC200N status = %u \r\n",lu32_status);
    }

    gLastSTA = lu32_status;


JUMP_CMD_RES_HANDEL:
    
    lu32_status = (uint32_t)(*status);
    switch ( lu32_status )
    {
        
    case M_EC20_HARD_RESET_OK:
        HAL_Delay(1000);
        MX_FEED_IWDG(); 
        HAL_Delay(1000);
        MX_FEED_IWDG(); 
        HAL_Delay(1000);
        MX_FEED_IWDG(); 
        (*cmd) = M_SIM_CHECK_START;
        break;

    case M_EC20_HARD_RESET_ERR:
        (*cmd) = M_EC20_HARD_RESET_START;
        break;

    case M_AT_TEST_OK:
        (*cmd) = M_SIM_CHECK_START;
        break;

    case M_SIM_CHECK_OK:
        (*cmd) = M_CSQ_CHECK_START;
        break;   

    case M_SIM_CHECK_ERR:
        (*cmd) = M_EC20_HARD_RESET_START;
        break;           
        
    case M_CSQ_CHECK_OK:
        (*cmd) = M_CGATT_CHECK_START;
        break;    

    case M_CGATT_CHECK_OK:

        if(0)
        {
            (*cmd) = M_QMTCFG_SET_START;
        }
        else  //如果是TCP模式的话,
        {
            (*cmd) = M_QIACT1_SET_START;     
        }

        break;  

    case M_CGATT_CHECK_ERR:

        (*cmd) = M_SIM_CHECK_START;
        break;          

        

    case M_QIACT1_SET_OK:

        if(0)
        {
            (*cmd) = M_QMTCFG_SET_START;
        }
        else  //如果是TCP模式的话,
        {
            (*cmd) = M_QUERY_QIACT_START;     
        }
        break;   

    case M_QIACT1_SET_ERR:

        //如果设置不成功,直接查询  PDP场景
        (*cmd) = M_QUERY_QIACT_START;     
        break;                


    case M_QUERY_QIACT_OK:

        (*cmd) = M_FTP_CFG_CONTID_START;     
        break;   

    case M_QUERY_QIACT_ERR:

        (*cmd) = M_EC20_HARD_RESET_START;     
        break;           
            

    // case M_QIOPEN_OK:

    //     (*cmd) = M_TCP_LOGIN_START;     
    //     break;  
        
    // case M_QIOPEN_ERR:

    //     (*cmd) = M_SIM_CHECK_START;     
    //     break;          

    // case M_TCP_LOGIN_OK:
    //     gu16_LoginRetryCnt = 0;
    //     (*cmd) = M_TCP_DATAUP_START;     
    //     break;    

    // case M_TCP_LOGIN_ERR:
        
    //     if(gu8_debug)
    //     {
    //         //临时修改  如果登录不成功  直接继续 DATAUP
    //         (*cmd) = M_TCP_DATAUP_START;   
    //         (*status) = M_TCP_DATAUP_START;                       
    //     }
    //     else
    //     {
    //         gu16_LoginRetryCnt++;
    //         (*cmd)      = M_TCP_LOGIN_START;
    //         (*status)   = M_TCP_LOGIN_START;            
    //         if(gu16_LoginRetryCnt > 3 )
    //         {
    //             (*cmd) = M_EC20_HARD_RESET_START;  
    //         }            
    //     }     
    //     break; 

    // case M_TCP_DATAUP_OK:
    //     gu16_DataUpRetryCnt = 0;
    //     (*cmd)    = M_TCP_CIRCY_SEND_WAIT;
    //     (*status) = M_TCP_CIRCY_SEND_WAIT; 
    //     g32_LastSec = Sys_GetSec();
    //     break;   

    // case M_TCP_DATAUP_ERR:    
    //     if(gu8_debug)
    //     {
    //         //临时修改  如果登录不成功  直接继续 DATAUP
    //         (*cmd) = M_TCP_DATAUP_START;   
    //     }
    //     else
    //     {
    //         (*cmd)      = M_TCP_DATAUP_START;
    //         (*status)   = M_TCP_DATAUP_START;          
    //         if(gu16_DataUpRetryCnt > 3 )
    //         {
    //             (*cmd) = M_EC20_HARD_RESET_START;  
    //         }            
    //     }  
    //     break;     
    
    // case M_TCP_CIRCY_SEND_WAIT:
    //     //当前是循环发送模式
    //     g32_NowSec  =   Sys_GetSec();
    //     g32_DiffSec =   g32_NowSec - g32_LastSec; 
    //     if(g32_DiffSec > M_TCP_DATAUP_INTER_S) 
    //     {
    //         (*cmd)  =   M_TCP_DATAUP_START;            
    //     }        
    //     break;

    // case M_QMTCFG_SET_OK:
    //     (*cmd) = M_QMTOPEN_OPEN_START;
    //     break;   
    
    // case M_QMTCFG_SET_ERR:
    //     (*cmd) = M_QMTDISC_0_START;
    //     break;        

    // case M_QMTOPEN_OPEN_OK:
    //     (*cmd) = M_QMTCONN_CONN_START;
    //     break;     

    // case M_QMTOPEN_OPEN_ERR:
    //     (*cmd) = M_QMTDISC_0_START;
    //     break;   

    // case M_QMTCONN_CONN_OK:
    //     (*cmd) = M_QMTPUBEX_PUB_START;
    //     break; 
    
    // case M_QMTCONN_CONN_ERR:
    //     (*cmd) = M_QMTDISC_0_START;
    //     break;                                            

    // case M_QMTDISC_0_OK:
    //     (*cmd) = M_QMTOPEN_OPEN_START;
    //     break;        

    // case M_QMTDISC_0_ERR:
    //     (*cmd) = M_QMTOPEN_OPEN_START;
    //     break;    
        
    // //新修改的  
    // case M_QMTPUBEX_PUB_ERR:
    //     (*cmd) = M_QMTOPEN_OPEN_START;
    //     break;    

    // case M_QMTPUBEX_PUB_OK:
    //     //当前是循环发送模式
    //     (*cmd)    = M_CIRCY_SEND_WAIT;
    //     (*status) = M_CIRCY_SEND_WAIT; 
    //     g32_LastSec = Sys_GetSec();
    //     break;   

    // case M_CIRCY_SEND_WAIT:
    //     //当前是循环发送模式
    //     g32_NowSec  =   Sys_GetSec();
    //     g32_DiffSec =   g32_NowSec - g32_LastSec; 
    //     if(g32_DiffSec > 0) 
    //     {
    //         (*cmd)  =   M_QMTPUBEX_PUB_START;            
    //     }        
    //     break;          
                                
/*FTP*/

    case M_FTP_CFG_CONTID_OK:
        (*cmd) = M_FTP_CFG_ACC_START;
        break;   

    case M_FTP_CFG_CONTID_ERR:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;   

    case M_FTP_CFG_ACC_OK:
        (*cmd) = M_FTP_CFG_FT_START;
        break;   

    case M_FTP_CFG_ACC_ERR:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;    
            
    case M_FTP_CFG_FT_OK:
        (*cmd) = M_FTP_CFG_TM_START;
        break;   

    case M_FTP_CFG_FT_ERR:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;            

    case M_FTP_CFG_TM_OK:
        (*cmd) = M_FTP_CFG_RSPT_START;
        break;

    case M_FTP_CFG_TM_ERR:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;          
    
    case M_FTP_CFG_RSPT_OK:
        (*cmd) = M_FTP_QFTPOPEN_START;
        break;    

    case M_FTP_CFG_RSPT_ERR:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;             
        
    case M_FTP_QFTPOPEN_OK:
        (*cmd) = M_FTP_QFTPCWD_START;
        break;                                   

    case M_FTP_QFTPOPEN_ERR:
        (*cmd) = M_FTP_QFTPCLOSE_START;
        break;   

    case M_FTP_QFTPCLOSE_OK:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;                                   

    case M_FTP_QFTPCLOSE_ERR:
        (*cmd) = M_EC20_HARD_RESET_START;
        break;           
        
    case M_FTP_QFTPCWD_OK:
        (*cmd) = M_FTP_QFTPSIZE_START;
        break;                                   

    case M_FTP_QFTPCWD_ERR:
        (*cmd) = M_FTP_QFTPCLOSE_START;
        break;    

    case M_FTP_QFTPSIZE_OK:
        (*cmd) = M_FTP_QFTPGET_START;
        break;                                   

    case M_FTP_QFTPSIZE_ERR:
        (*cmd) = M_FTP_QFTPCLOSE_START;
        break;    

    case M_FTP_QFTPGET_OK:
        (*cmd) = M_FTP_QFOPEN_START;
        break;                                   
    
    case M_FTP_QFTPGET_ERR:
        if(  613 == st_EC20LinkVar.u16_FtpErrCode )  //文件错误
        {
            gSavedLastCMD = M_FTP_QFTPGET_ERR;
            gSavedLastSTA = M_FTP_QFTPGET_ERR;
            (*cmd) = M_FTP_QFDELUFSALL_START;  //删除4G模块内部的UFS系统内的所有文件
        }
        else
        {
            (*cmd) = M_FTP_QFTPCLOSE_START;  
        }
        break;     

    case M_FTP_QFDELUFSALL_OK:
        if(  M_FTP_QFTPGET_ERR == gSavedLastSTA )  
        {
            (*cmd) = M_FTP_QFTPGET_START;  
        }
        else
        {
            (*cmd) = M_FTP_QFTPCLOSE_START; 
        }    
        break;                                   
    
    case M_FTP_QFDELUFSALL_ERR:
        (*cmd) = M_FTP_QFCLOSE_START;  
        break;  

    case M_FTP_QFOPEN_OK:
        (*cmd) = M_FTP_QFSEEK_START;
        break;                                   

    case M_FTP_QFOPEN_ERR:
        (*cmd) = M_FTP_QFTPCLOSE_START;
        break;    

    case M_FTP_QFCLOSE_OK:
        (*cmd) = M_FTP_CFG_CONTID_START;
        break;                                   

    case M_FTP_QFCLOSE_ERR:
        (*cmd) = M_EC20_HARD_RESET_START;
        break;                  

    case M_FTP_QFSEEK_OK:
        (*cmd) = M_FTP_QFREAD_START;
        break;                                   

    case M_FTP_QFSEEK_ERR:
        (*cmd) = M_FTP_QFTPCLOSE_START;
        break;                                      
    
    case M_FTP_QFREAD_OK:
        (*cmd) = M_FTP_QFREAD_OK;
        gs_DecCmd.SysCmd = M_OTA_JUMP;
        
        uint32_t lu32_filelen =  st_EC20LinkVar.u32_FtpFileDownloadSize;
        char str_md5[80];

        DEBUG_printf(DEBUG_UART,"MD5 cal start lu32_filelen= %d \r\n",lu32_filelen);
        //get_flash_md5("C",lu32_filelen,&str_md5[0]);
        get_EEPROM_md5("C",lu32_filelen,&str_md5[0]);        
        
        DEBUG_printf(DEBUG_UART,"MD5 = %s\r\n",str_md5);

        break;  

    case M_FTP_QFREAD_ERR:
        (*cmd) = M_FTP_QFSEEK_START;
        break;            

    default:
        lu32_cmd = (uint32_t)(*cmd);     
        //DEBUG_printf(DEBUG_UART,"EC200N CMD = %u  UNHANDLE\r\n",lu32_cmd);  
        //DEBUG_printf(0,"EC200N cmd = %u NO CHANGE \r\n",lu32_cmd);   
        //SEGGER_RTT_printf(0,"RTT cmd = %u NO CHANGE \r\n",lu32_cmd);   
        return ERROR;
        break;
    }
    
    lu32_cmd = (uint32_t)(*cmd); 
    if( lu32_cmd!= gLastCMD)
    {
        DEBUG_printf(DEBUG_UART,"EC200N cmd = %u \r\n",lu32_cmd);   
    }
    gLastCMD = lu32_cmd;    

}

// typedef enum 
// {
//     M_T_4G_IDLE = 0x0000, 
//     M_T_SETOTA, //1
//     M_T_LOGINACK,//2
//     M_T_DATAUPACK//2    
// } enum_TEST_4G; 

// uint16_t F_TEST_TCP_COMM(enum_TEST_4G *cmd)
// {
//     uint32_t lu32_cmd = 0;
//     ErrorStatus l_err = SUCCESS;
//     lu32_cmd = (*cmd);

//     switch (lu32_cmd)
//     {
//     case M_T_4G_IDLE:
//         /* code */
//         break;
    
//     case M_T_SETOTA: //1
//         /* code */
//         l_err = F_TCP_SETOTAPack();
//         if(SUCCESS == l_err)
//         {
//             gu16_SendLen = gs_TCP_DataPack.u32Length;
//             memcpy(&Sendbuf,&gu8A_TCPToalDataBag,gu16_SendLen);
//             HAL_UART_Transmit(&huart1, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);
//             (*cmd) =   M_T_4G_IDLE;                   
//         }             
//         break;

//     case M_T_LOGINACK: //3
//         /* code */
//         l_err = F_TCP_LoginAckPack();
//         if(SUCCESS == l_err)
//         {
//             gu16_SendLen = gs_TCP_DataPack.u32Length;
//             memcpy(&Sendbuf,&gu8A_TCPToalDataBag,gu16_SendLen);
//             HAL_UART_Transmit(&huart1, (uint8_t *)&Sendbuf,gu16_SendLen, 0xffff);
//             (*cmd) =   M_T_4G_IDLE;                   
//         }             
//         break;

//     case M_T_DATAUPACK:
//         /* code */
//         break;        

//     default:
//         break;
//     }
// }

/******************************************************************************
* Name		: Alg_EC20Link_ParseInfo
* brief		: None.
* param		: None.
* retval	: BSP status
*******************************************************************************/
FuncState Alg_EC20Link_ParseInfo(char* pChar,char* pDstStr,uint16_t dstLenth)
{
	char *pTempStr;
	char *pTempStrHead;
	char *pTempStrTail;
	uint16_t tempLenth;
	FuncState ret = FAIL;
	
	// pTempStr = strstr((char*)&m_u8_EC20RecvBuff[0],pChar);
    pTempStr = strstr((char*)&m_u8_EC20RecvBuff[0],pChar);

	if(NULL != pTempStr)
	{
		pTempStrHead = pTempStr + strlen(pChar);
		pTempStrTail = strstr(pTempStrHead,"\r\n");
		
		if(pTempStrTail < pTempStrHead)
		{
			pTempStrHead = pTempStr;
		}
		
		tempLenth = pTempStrTail - pTempStrHead;
		tempLenth = MIN(tempLenth,dstLenth);
		memset(pDstStr,0x00,dstLenth);
		memcpy(pDstStr,pTempStrHead,tempLenth);
		ret = SUCC;
	}
	return ret;
}

void APP_EC20Link_Init(void)
{
	uint16_t i;

	char *retStr	    = NULL;
	char *retStr1    = NULL;    
	char *retStrHead = NULL;
	char *retStrTail = NULL;       
	uint16_t tempLenth;    

	// for(i = 0;i < EC20LINK_FUNC_OBJS_LENTH;i++)
	// {
	// 	memset(&st_ProcParm[i],0,sizeof(_ProcParmType_Def));
	// }
	
	// m_u16_TimeSliceIndex = 0;
	// st_TimeSliceState = FALSE;
	// st_EC20SendCmd = FALSE;
	st_EC20RecvCmd = FALSE;
	st_EC20RestCmd = FALSE;
	st_EC20DownloadCmd = FALSE;
	// st_EC20BurnCmd = FALSE;
	
	//memset(&m_u8_EC20SendBuff[0],0,EC20_SEND_BUFF_SIZE);
	memset(&m_u8_EC20RecvBuff[0],0,EC20_RECV_BUFF_SIZE);
	//m_u8_EC20SendLenth = 0;
	m_u8_EC20RecvLenth = 0;

	//memset(&st_PrcoStateAll,0,sizeof(_ProcStateAllType_Def));

	//m_u32_SignalQLTYCnt = 0;
	
	memset(&st_EC20LinkVar,0,sizeof(_ProcVariableAllType_Def));

	// for(i = 0;i < EC20LINK_FUNC_OBJS_LENTH;i++)
	// {
	// 	if(PROC_CLASS_REST == EC20LinkFuncObjs[i].ProcClass)
	// 	{
	// 		st_ProcParm[i].Ctl = PROC_CTL_ENBL;
	// 		break;
	// 	}
	// }
	
	st_EC20LinkVar.u16_FtpPortNum	= 21;
	st_EC20LinkVar.u8_FtpContextID	= 1;
	st_EC20LinkVar.u8_FtpFileType	= 0;
	st_EC20LinkVar.u8_FtpTransMode	= 1;
	st_EC20LinkVar.u8_FtpTimeOut1S	= 90;

	//GPIO_SetBits(GPIOE, GPIO_Pin_12);
	
    // if(gs_TCPRecInfoOTA.u16_FLG == )

    // gs_TCPRecInfoOTA.

    // retStr = strstr((char*)&m_u8_EC20RecvBuff[0],M_OTA_IPAITE);


    // retStrHead = retStr + sizeof(EC20_FTP_CWD_FOLDER_ANS) - 1;
    // retStrTail = strstr(retStrHead,"\r\n");
    // tempLenth = retStrTail - retStrHead;
    // tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpFolderInfo));

    // retStr = strstr((char*)&gs_TCPRecInfoOTA.ucA_OTA_URL[0],M_OTA_IPAITE);
    // if(NULL != retStr)
    // {
    //      retStrHead = retStr + sizeof(M_OTA_IPAITE);
    //      retStrTail = strstr(retStrHead,"\\");
    //     tempLenth = retStrTail - retStrHead;
    //     tempLenth = MIN(tempLenth,sizeof(st_EC20LinkVar.s_FtpServerDMN));
    //     memcpy(&st_EC20LinkVar.s_FtpServerDMN[0],retStrHead,tempLenth);     
    // }    

    memcpy(&st_EC20LinkVar.s_FtpFilePath[0],&stBoot2.FilePath[0],STRING_FILE_PATH_LEN);    
    memcpy(&st_EC20LinkVar.s_FtpServerDMN[0],&stBoot2.ServerDMN[0],STRING_SERVER_DMN_LEN);        
    memcpy(&st_EC20LinkVar.s_FtpFileName[0],&stBoot2.FileName[0],STRING_FILE_NAME_LEN);    
    memcpy(&st_EC20LinkVar.s_FtpUserName[0],&stBoot2.UserName[0],STRING_USER_NAME_LEN);           
    memcpy(&st_EC20LinkVar.s_FtpUserPassword[0],&stBoot2.PassWord[0],STRING_PASSWORD_LEN);              
    
    
    DEBUG_printf(DEBUG_UART,"BOOT st_EC20LinkVar s_FtpFilePath %s\r\n",st_EC20LinkVar.s_FtpFilePath);  
    DEBUG_printf(DEBUG_UART,"BOOT st_EC20LinkVar s_FtpServerDMN %s\r\n",st_EC20LinkVar.s_FtpServerDMN);        
    DEBUG_printf(DEBUG_UART,"BOOT st_EC20LinkVar s_FtpFileName %s\r\n",st_EC20LinkVar.s_FtpFileName);          
    DEBUG_printf(DEBUG_UART,"BOOT st_EC20LinkVar s_FtpUserName %s\r\n",st_EC20LinkVar.s_FtpUserName);         
    DEBUG_printf(DEBUG_UART,"BOOT st_EC20LinkVar s_FtpUserPassword %s\r\n",st_EC20LinkVar.s_FtpUserPassword);       

    
    
	// strcpy(&st_EC20LinkVar.s_FtpUserName[0],	"cartech");
	// strcpy(&st_EC20LinkVar.s_FtpUserPassword[0],"n13CF16thA");
	// strcpy(&st_EC20LinkVar.s_FtpServerDMN[0],	"39.98.76.17");
	// strcpy(&st_EC20LinkVar.s_FtpFilePath[0],	"/test");
	// strcpy(&st_EC20LinkVar.s_FtpFileName[0],	"SMP0100A00PRO.bin");

}

// {
//     "type":"variant_data",
//     "version":"1.0",
//     "time":1638766638000,
//     "params":
//     {
//         "UAV":0.1,
//         "UBV":0.1,
//         "UCV":0.1,
//         "IAA":0.1,
//         "IBA":0.1,
//         "ICA":0.1,
//         "PAW":0.0,
//         "PBW":0.0,
//         "PCW":10178313.0,
//         "PTW":10178313.0
//     }
// }

想要EEPROM芯片驱动的,STM32实现MD5算法的关注我,后面我会发布这些部分的教程。

容易踩的坑:

程序跳转前一定要关闭中断,不然会出一些让你摸不到头脑的问题。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_21370051/article/details/135029956

智能推荐

LDO分析2---LDO的分类及稳定性分析_ldo稳定性分析-程序员宅基地

文章浏览阅读6.4k次,点赞12次,收藏67次。对于LDO而言,现如今的分类主要有无片外电容的LDO以及传统的有片外电容的LDO,这两种LDO的结构主要为下图:如上图中左图为传统的LDO,其最主要的特点在于LDO的输出电容和负载都在片外,在这种结构下,得到的LDO芯片的面积会因为较大的输出电容而增大,从而损耗更多的面积,基于这个缺点,之后提出了无片外电容的LDO,如上右图所示,此时得到的电路结构中,输出电容较小,因此此电容会嵌入在片内,此时会极大的减少了芯片的面积,那么两个不同的结构最大区别便在稳定性的分析:接下来我们就基于以下假设对两种结构的LD_ldo稳定性分析

laravel注册页面(jquery验证)_$("#coderandom").val(data.message)-程序员宅基地

文章浏览阅读792次。html&lt;form class="reg_info" action="" method="post"&gt; &lt;div class="col-md-6 login-do1 animated wow fadeInLeft" data-wow-delay=".5s"&gt; @if(count($errors)&gt;0) @if_$("#coderandom").val(data.message)

texstudio统计字数-程序员宅基地

文章浏览阅读2.5w次,点赞10次,收藏8次。texstudio:工具-分析文本不同的词组70个,意思是有70个单词_texstudio统计字数

python 七大数据类型-程序员宅基地

文章浏览阅读213次。python 七大数据类型

吉时利Keithley 4200-SCS参数分析仪_吉时利了4200-scs-程序员宅基地

文章浏览阅读51次。它可以帮助研究人员对不同材料的电学特性进行准确测量和分析。-KEITHLEY吉时利4200-SCS半导体特性分析系统还被广泛应用于功率器件的研究和测试。-在光电子学领域,KEITHLEY吉时利4200-SCS半导体特性分析系统可用于测量光电二极管和太阳能电池等器件的性能。它为学生和研究人员提供了一个实验平台,可以进行各种半导体器件的测量和分析实验,促进他们的学习和研究成果。-在半导体器件制造过程中,KEITHLEY吉时利4200-SCS半导体特性分析系统可用于对制造过程中的器件进行测试和质量控制。_吉时利了4200-scs

Casey 正统 Runes 协议的发行和转账|本地 Bitcoin 网络实操_比特币符文部署教程-程序员宅基地

文章浏览阅读991次,点赞22次,收藏18次。Casey 正统 Runes 协议的发行和转账|本地 Bitcoin 网络实操 _比特币符文部署教程

随便推点

Android 四大组件之广播_android 广播-程序员宅基地

文章浏览阅读3.6k次,点赞8次,收藏17次。在Android中, 什么是广播?、系统广播、自定义广播、本地广播、广播的注册_android 广播

如何使用 ESlint + prettier 建立规范的vue3.0项目_eslint和vue3.0-程序员宅基地

文章浏览阅读1k次。如何使用 ESlint + prettier 建立规范的vue3.0项目前言 一个完整的项目必然是多人合作的开发项目,为了提升代码的质量,统一代码风格成了每个优秀的项目的必然选择,本期用现在最流行的ESlint + prettier在VUE3.0的环境下建立一个自动格式化符合eslint标准规范的项目。1 如何配置文件1 新建VUE3.0的项目 使用配置如下图 不一定要完全依照下面配置..._eslint和vue3.0

Android开发之PopupWindow(实现弹窗)_android popupwindow-程序员宅基地

文章浏览阅读6.8k次,点赞8次,收藏36次。包括唤出弹窗、弹窗内容的自定义与监听。_android popupwindow

TOMCAT 中间件安全加固_中间件加固方案-程序员宅基地

文章浏览阅读228次。对于一些常见的错误页面,我们可以在配置文件/etc/tomcat/web.xml中,重定向403、404以及500错误到指定页面。在这里插入图片描述我们现在在web.xml配置文件中加入error-page参数。在这里插入图片描述我们现在编辑我们的错误页面。该错误页默认放在我们webapps目录中。在这里插入图片描述这里是我们tomcat默认的页面所在位置。在这里插入图片描述重启tomcat服务,我们可以看到,页面为我们自定义的错误页面了。在这里插入图片描述。_中间件加固方案

layui实现数据表格table的搜索功能_layui table查询-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏10次。layui根据特定信息对表格进行搜索并显示效果实现html部分js部分Controller层Mapper层注意总结效果先放效果图此处根据“角色名称”进行搜索,得到效果实现html部分此处注意!!需要要为input、table里边加上“id”属性,在js部分需要特定进行获取。<div class="layuimini-container"> <div class="layuimini-main"> _layui table查询

机器学习中的数学——深度学习优化的挑战:病态_优化函数 病态-程序员宅基地

文章浏览阅读1.5w次,点赞5次,收藏7次。优化通常是一个极其困难的任务。传统的机器学习会小心设计目标函数和约束,以确保优化问题是凸的,从而避免一般优化问题的复杂度。在训练神经网络时,我们肯定会遇到一般的非凸情况。即使是凸优化,也并非没有任何问题。在本文中,我们会总结几个训练深度模型时会涉及的主要挑战。病态在优化凸函数时,会遇到一些挑战。这其中最突出的是Hessian矩阵HHH的病态。这是数值优化、凸优化或其他形式的优化中普遍存在的问题。病态问题一般被认为存在于神经网络训练过程中。病态体现在随机梯度下降会“卡”在某些情况,此时即使很小的更新步长也_优化函数 病态

推荐文章

热门文章

相关标签