stm32_ota/ABM开发板(BOOT源码)/BOOTV2.1/HARDWARE/LTE/EC20/ec20module.c

411 lines
18 KiB
C
Raw Normal View History

2024-12-17 20:03:43 +08:00
#include "ec20module.h"
#include "stm32f10x_gpio.h"
#include "sysport.h"
#include "syslib.h"
#include "io.h"
/********************************************************************************
* @file ec20module.c
* @author <EFBFBD>̳ϿƼ<EFBFBD> Mr.Wang
* @version V1.0.0
* @date 11-Dec-2018
* @brief <EFBFBD>Quectelģ<EFBFBD><EFBFBD>EC20ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣨿<EFBFBD><EFBFBD><EFBFBD>IO<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><EFBFBD><EFBFBD>ء<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD>CSQ<EFBFBD><EFBFBD>ICCID<EFBFBD>ȣ<EFBFBD>
******************************************************************************
* @attention
* <EFBFBD>ⲿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>EC20_Module_Init()<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>MCU<EFBFBD>޷<EFBFBD><EFBFBD><EFBFBD>EC20ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EC20<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>û<EFBFBD>а<EFBFBD>װ<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD>µġ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>ǰģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>Ȳ<EFBFBD>ѯSIM<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>CS Service<EFBFBD><EFBFBD>PS service<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD>Э<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>ͨѶ
*******************************************************************************/
/*****************************************
*ec20 module<EFBFBD><EFBFBD><EFBFBD>صij<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
****************************************/
ModuleParam_s sEc20Param ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EC20ģ<30><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľṹ<C4BD><E1B9B9>
volatile bool httpDataMode = false ; //<2F><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>http<74><70><EFBFBD><EFBFBD>ģʽ
volatile bool ftpDataMode = false ; //<2F><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ftp<74><70><EFBFBD><EFBFBD>ģʽ
char ec20AtBuf[EC20_ATBUF_LEN] ; //EC20 AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
char ec20HttpBuf[EC20_HTTPBUF_LEN] ; //EC20 HTTP<54><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
char ec20FtpBuf[EC20_FTPBUF_LEN] ; //EC20 FTP<54><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>
volatile int ec20FtpBufIndex = 0 ; //ec20FtpBuf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD>дָ<D0B4><D6B8>
FrameQueue_s sTcpQueue ; //<2F><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢ģ<E6B4A2><EFBFBD>ص<EFBFBD>tcp<63><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
FrameQueue_s sUrcQueue ; //<2F><><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢ģ<E6B4A2><EFBFBD>ص<EFBFBD>URC<52><43><EFBFBD><EFBFBD>
/********************************************************
ec20ģ<EFBFBD><EFBFBD>Moduleָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD>
*********************************************************/
enum eModuleCmdNum
{
TURNOFF = 0, HANDSHAKE = 1, QUERYCONFIG = 2,
CLOSEECO =3, SAVECONFIG =4, QUERYRELESE =5,
QUERYVOLTAGE=6
} ; //ö<><C3B6>ec20ģ<30><C4A3>Module<6C><65><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
volatile EC20_CMD_DATA_s sModuleCmd[7]=
{
// cmdNum cmdStr, timeout trueStr trueOffset falseStr revResult rtyNum
{TURNOFF, "AT+QPOWD\r\n", (65*10), "POWERED DOWN", -1, "ERROR", TIMEOUT, 2 }, //<2F>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>
{HANDSHAKE, "AT\r\n", 10, "OK" , -1, "ERROR", TIMEOUT, 3 }, //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
{QUERYCONFIG, "AT&V\r\n", 3, "E: 0" , -1, "E: 1", TIMEOUT, 1 }, //<2F><>ѯEC20<32><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AT&V
{CLOSEECO, "ATE0\r\n", 3, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATE0<45><30><EFBFBD><EFBFBD>
{SAVECONFIG, "AT&W\r\n", 3, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{QUERYRELESE, "AT+GMR\r\n", 3, "OK" , -1, "ERROR", TIMEOUT, 2 }, //<2F><>ѯEC20<32><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{QUERYVOLTAGE,"AT+CBC\r\n", 10, "+CBC" , -1, "ERROR", TIMEOUT, 2 } //<2F><>ѯEC20<32><30>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
} ; //EC20ģ<30><C4A3>module<6C><65><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>EC20_CMD_DATA_s<5F><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> static const char *ModuleCmdNumToString(enum eModuleCmdNum result)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ٳ<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> eModuleCmdNum<EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>ö<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ϊö<EFBFBD>ٵij<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
**************************************************************************************************/
static const char *ModuleCmdNumToString(enum eModuleCmdNum result)
{
switch (result)
{
ENUM_CHIP_TYPE_CASE(TURNOFF)
ENUM_CHIP_TYPE_CASE(HANDSHAKE)
ENUM_CHIP_TYPE_CASE(QUERYCONFIG)
ENUM_CHIP_TYPE_CASE(CLOSEECO)
ENUM_CHIP_TYPE_CASE(SAVECONFIG)
ENUM_CHIP_TYPE_CASE(QUERYRELESE)
ENUM_CHIP_TYPE_CASE(QUERYVOLTAGE)
}
return "<EFBFBD>޴<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> void Ec20AtBufReset(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ec20AtBuf<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
**************************************************************************************************/
void Ec20AtBufReset(void)
{
memset(ec20AtBuf, 0, EC20_ATBUF_LEN) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> void Ec20HttpBufReset(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ec20HttpBuf<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
**************************************************************************************************/
void Ec20HttpBufReset(void)
{
memset(ec20HttpBuf, 0, EC20_HTTPBUF_LEN) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> void Ec20FtpBufReset(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ec20FtpBuf<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
**************************************************************************************************/
void Ec20FtpBufReset(void)
{
ec20FtpBufIndex = 0 ;
memset(ec20FtpBuf, 0, EC20_FTPBUF_LEN) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> void Ec20ReceiveFrameCallback(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> EC20ģ<EFBFBD><EFBFBD><EFBFBD>>MCU<EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD><EFBFBD><EFBFBD>տ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>EC20ģ<EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>http<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>2<EFBFBD><EFBFBD>tcp<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>3<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>URC<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
**************************************************************************************************/
void Ec20ReceiveFrameCallback(char *recvBuf, uint16_t recvLen)
{
int pos = 0;
//printf("\r\nEC20:%s", buf) ;
// if( httpDataMode == true ) /*<2A><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>ģʽΪ<CABD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HTTP<54><50><EFBFBD><EFBFBD>*/
// {
// strncat(ec20HttpBuf, recvBuf, recvLen) ;
//// SysLog("COM3 RxLen:%d; RxBuf:%s", len, uart3_Dma_Rx_Buf);
// }
if( ftpDataMode == true ) /*<2A><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>ģʽΪ<CABD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HTTP<54><50><EFBFBD><EFBFBD>*/
{
memcpy((ec20FtpBuf+ec20FtpBufIndex), recvBuf, recvLen) ;
ec20FtpBufIndex += recvLen ;
}
else if ( kmp(recvBuf, "+QIURC:")>=0 ) /*<2A>ж<EFBFBD><D0B6>Ƿ<EFBFBD>ΪTCP<43><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD>URC*/
{
pos = kmp(recvBuf, "+QIURC: \"recv\"") ;
if( pos>=0) /*<2A>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>յ<EFBFBD>TCP<43><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
{
if( RW_OK != InsertQueueMemData(&sTcpQueue, recvBuf, recvLen) )
{
ErrorLogPrintf("%s,%d:sTcpQueue spillover<65><72>",__FILE__, __LINE__) ;
}
}
else /*<2A>ж<EFBFBD><D0B6><EFBFBD>ģ<EFBFBD><EFBFBD>ص<EFBFBD>URC*/
{
if( RW_OK != InsertQueueMemData(&sUrcQueue, recvBuf, recvLen) )
{
ErrorLogPrintf("%s,%d:sUrcQueue spillover<65><72>",__FILE__, __LINE__) ;
}
}
}
else //EC20ģ<30><C4A3>AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if( recvLen < (EC20_ATBUF_LEN-strlen((const char*)ec20AtBuf))) /*ec20AtBufʣ<66><EFBFBD><E0B3A4><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>recvBuf*/
{
strcat((char*)ec20AtBuf, recvBuf) ; //<2F><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ洢<DDB4><E6B4A2>ec20AtBuf<75><66>ȥ
}
else /*ec20AtBufʣ<66><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>recvBuf*/
{
ErrorLogPrintf("%s,%d:ec20AtBuf spillover. ",__FILE__, __LINE__) ; //<2F><><EFBFBD><EFBFBD>
Ec20AtBufReset() ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ec20AtBuf
strncpy((char*)ec20AtBuf, recvBuf, EC20_ATBUF_LEN) ; //<2F>ٽ<EFBFBD>recvBuf<75>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݿ<EFBFBD><DDBF><EFBFBD><EFBFBD><EFBFBD>ec20AtBuf<75><66>ȥ
}
}
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20_Module_Init( void )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> EC20ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>رջ<EFBFBD><EFBFBD>ԡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD>ѯSIM<EFBFBD><EFBFBD><EFBFBD>š<EFBFBD>ע<EFBFBD><EFBFBD>CS\PS<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯCSQ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20_Module_Init( void )
{
RunResult runResult = TIMEOUT ;
EC20_Uart_Init() ; //EC20_UART<52><54><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><CABC>,<2C><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>ڻص<DABB><D8B5><EFBFBD><EFBFBD><EFBFBD>
EC20_GPIO_Init() ; //MCU<43><55>EC20<32><30><EFBFBD><EFBFBD>IO<49><4F>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դʹ<D4B4><CAB9><EFBFBD><EFBFBD><EFBFBD>š<EFBFBD><C5A1><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>
return(runResult) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20_SendModuleCmd( uint8_t cmdNum, char *format,... )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> MCU<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EC20<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Module<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 cmdNum EC20_CMD_DATA_s<EFBFBD><EFBFBD>cmdNum<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param2 char *format,... <EFBFBD>ɱ<EFBFBD><EFBFBD>α<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20_SendModuleCmd( uint8_t cmdNum, char *format,... )
{
uint8_t revTimes = 0 ;
RunResult status = TIMEOUT ;
uint8_t retryTimes = sModuleCmd[cmdNum].rtyNum ;
char *cmdPack = NULL ;
format = sModuleCmd[cmdNum].cmdStr ;
cmdPack = portMalloc(MODULE_CMDPACK_LEN*sizeof(uint8_t)) ;
va_list ap;
va_start (ap, format);
int outLen = vsnprintf(cmdPack, MODULE_CMDPACK_LEN, (const char*)format, ap); //vsprintf (temp, cmd, ap); //<2F><><EFBFBD><EFBFBD>Ϊֹ<CEAA><D6B9><EFBFBD><EFBFBD><EFBFBD>еIJ<D0B5><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ܵ<EFBFBD>temp<6D><70>
if((outLen<=0)||( outLen > MODULE_CMDPACK_LEN))
{
ErrorLogPrintf("%s,%d:cmdPack spillover<65><72>",__FILE__, __LINE__) ;
va_end (ap);
portFree(cmdPack) ;
return RUNERR ;
}
while(retryTimes--) //<2F><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
Ec20AtBufReset() ; //ec20AtBuf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
revTimes = 0 ; //<2F><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UARTx_SendData(EC20_UART, cmdPack, outLen) ; //EC20_UART<52><54><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>
while( revTimes++ < sModuleCmd[cmdNum].timeout ) /*<2A><><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD><EFBFBD>һֱ<D2BB><D6B1>ec20AtBuf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>trueStr*/
{
Wait_For_Nms(100) ; //<2F><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sModuleCmd[cmdNum].trueOffset = kmp(ec20AtBuf, sModuleCmd[cmdNum].trueStr) ; //<2F><>ȡsModuleCmd[cmdNum].trueStr<74><72>ec20AtBuf<75>е<EFBFBD>ƫ<EFBFBD><C6AB>ֵ
if( sModuleCmd[cmdNum].trueOffset >= 0) /*<2A><>ec20AtBuf<75>л<EFBFBD>ȡ<EFBFBD><C8A1>sModuleCmd[cmdNum].trueStr<74>ִ<EFBFBD>*/
{
status = RUNOK ;
goto OUT ;
}
else if( kmp(ec20AtBuf, sModuleCmd[cmdNum].falseStr) >= 0)/*<2A><>ec20AtBuf<75><66>û<EFBFBD>л<EFBFBD>ȡ<EFBFBD><C8A1>sModuleCmd[cmdNum].trueStr<74>ִ<EFBFBD>*/
{
status = RUNERR ;
goto OUT ;
}
}
Wait_For_Nms( 500+( sModuleCmd[cmdNum].rtyNum-retryTimes)*100 ) ; //ʧ<>ܺ<EFBFBD><DCBA><EFBFBD>ʱһ<CAB1><D2BB>ʱ<EFBFBD><CAB1><EFBFBD>ٴη<D9B4><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
OUT:
portFree(cmdPack) ; //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
va_end (ap) ; //<2F>ͷ<EFBFBD><CDB7>ڴ<EFBFBD><DAB4>ռ<EFBFBD>
DebugLogPrintf("%s %s", ModuleCmdNumToString((enum eModuleCmdNum)cmdNum), RunResultToString(status) ) ; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>
return (status) ; //<2F><><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> void EC20_Uart_Init(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>EC20_UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>EC20_UART<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
void EC20_Uart_Init(void)
{
UARTx_Init(EC20_UART, 9600, USART_Mode_Rx | USART_Mode_Tx, INT_RANK_0) ; //MCU<43><55>EC20ͨѶ<CDA8>Ĵ<EFBFBD><C4B4>ڳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>շ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD>INT_RANK_1
Ec20AtBufReset() ; //ec20AtBuf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
Ec20HttpBufReset() ; //ec20HttpBuf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
InitQueueMem(&sTcpQueue) ; //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢ģ<E6B4A2><EFBFBD>ص<EFBFBD>tcp<63><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
InitQueueMem(&sUrcQueue) ; //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢ģ<E6B4A2><EFBFBD>ص<EFBFBD>URC<52><43><EFBFBD><EFBFBD>
Uart_RegHookCallback(EC20_UART, Ec20ReceiveFrameCallback) ; //ע<><D7A2>EC20<32><30><EFBFBD><EFBFBD>֡<EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> void EC20_GPIO_Init( void )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> EC20ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
**************************************************************************************************/
void EC20_GPIO_Init( void )
{
Gpio_Init(EC20_POW_PORT, EC20_POW_PIN, GPIO_Mode_Out_PP) ;
EC20_POWOFF() ; //<2F><>ʼ<EFBFBD><CABC>ʱEC20<32><30>ʼΪ<CABC>ϵ<EFBFBD>״̬
Gpio_Init(EC20_RST_PORT, EC20_RST_PIN, GPIO_Mode_Out_PP) ; //PERST<53><54><EFBFBD><EFBFBD> = PE15<31><35><EFBFBD><EFBFBD>
EC20_RST = 0 ;
}
/****************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD>void EC20_POWON(void)
* <EFBFBD><EFBFBD> <EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EC20ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
****************************************************************************/
void EC20_POWON(void)
{
// Wait_For_Nms(3000) ; //<2F><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>3S<33>ϵ<EFBFBD>״̬
EC20_POW = 1 ;
}
/****************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD>void EC20_POWOFF(void)
* <EFBFBD><EFBFBD> <EFBFBD>ܣ<EFBFBD><EFBFBD>ر<EFBFBD>EC20ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
****************************************************************************/
void EC20_POWOFF(void)
{
EC20_POW = 0 ;
Wait_For_Nms(3000) ; //<2F>ϵ<EFBFBD><CFB5>󱣳<EFBFBD>5S<35>ϵ<EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>Ϊģ<CEAA><C4A3><EFBFBD>ں˿<DABA><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>ݷŵ<DDB7>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ȫ<EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/****************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD>RunResult EC20_START(void)
* <EFBFBD><EFBFBD> <EFBFBD>ܣ<EFBFBD>EC20<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
* ˵ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>EC20<EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>15S<EFBFBD>ڴ<EFBFBD><EFBFBD>ڻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RDY<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
****************************************************************************/
RunResult EC20_START(void)
{
uint8_t findCount = 0 ;
RunResult runStatus = TIMEOUT ;
EC20_POWON() ; //<2F><><EFBFBD><EFBFBD>EC20<32><30>Դ
Ec20AtBufReset() ; //ec20AtBuf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
while( findCount < 20) //ѭ<><D1AD><EFBFBD>ȴ<EFBFBD>EC20<32><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
{
findCount++ ;
Wait_For_Nms(1000) ;
if( kmp(ec20AtBuf, "RDY") >= 0) /*<2A>յ<EFBFBD>EC20<32><30><EFBFBD>صġ<D8B5>RDY<44><59><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>EC20<32><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
{
DebugLogPrintf("EC20 Start Waited:%d S", findCount ) ;
runStatus = RUNOK ;
break ;
}
}
return(runStatus) ;
}
/****************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD>RunResult EC20_CLOSE(void)
* <EFBFBD><EFBFBD> <EFBFBD>ܣ<EFBFBD>EC20<EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD>--><EFBFBD>ȴ<EFBFBD>1S--><EFBFBD>ϵ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
****************************************************************************/
RunResult EC20_CLOSE(void)
{
RunResult runStatus = TIMEOUT ;
runStatus = EC20_SendModuleCmd(TURNOFF, NULL ) ;
if( RUNOK != runStatus )
{
ErrorLogPrintf("EC20 <20><><EFBFBD>ػ<EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>ػ<EFBFBD><D8BB><EFBFBD>") ;
}
Wait_For_Nms(1000) ; //<2F><>AT Command<6E><64><EFBFBD>ֲ<EFBFBD><D6B2>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD>ʱ1s<31><73><EFBFBD>ٶϵ<D9B6>
EC20_POWOFF() ;
return (runStatus) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20_Handshake( void )
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> MCU<EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><EFBFBD><EFBFBD>ATָ<EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20_Handshake( void )
{
RunResult runStatus = TIMEOUT ;
runStatus = EC20_SendModuleCmd(HANDSHAKE, NULL ) ;
return (runStatus) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20_CloseEcho(void)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ر<EFBFBD>EC20ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20_CloseEcho(void)
{
RunResult runStatus = TIMEOUT ;
runStatus = EC20_SendModuleCmd( QUERYCONFIG, NULL ) ;
if( runStatus != RUNOK )
{
EC20_SendModuleCmd( CLOSEECO, NULL ) ; //<2F>رմ<D8B1><D5B4><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ECHO
runStatus = EC20_SendModuleCmd( QUERYCONFIG, NULL ) ;
// EC20_SendModuleCmd( SAVECONFIG, sModuleCmd[SAVECONFIG].cmdStr ) ; //Ϊ<>˼<EFBFBD><CBBC><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><E6B1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
return (runStatus) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20_Query_SoftRelese(char *version)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ѯEC20<EFBFBD>Ĺ̼<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *version <EFBFBD><EFBFBD><EFBFBD><EFBFBD>version<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ַ
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20_Query_SoftRelese(char *version)
{
RunResult runStatus = TIMEOUT ;
char *start ;
memset(version, 0, EC20_VER_LEN+1);
runStatus = EC20_SendModuleCmd(QUERYRELESE, NULL ) ;
if( RUNOK == runStatus )
{
start = strchr( (const char*)ec20AtBuf, 0x0D ) ;
CopyValues((uint8_t*)version, (uint8_t*)(start+2), 0x0D, EC20_VER_LEN) ;
}
return (runStatus) ;
}
/**************************************************************************************************
* <EFBFBD><EFBFBD> <EFBFBD>ƣ<EFBFBD> RunResult EC20_Query_Voltage(char *voltage)
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ѯEC20<EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 *voltage <EFBFBD><EFBFBD><EFBFBD><EFBFBD>voltage<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>ַ
* <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param1 status RunResultö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD>
**************************************************************************************************/
RunResult EC20_Query_Voltage(char *voltage)
{
RunResult runStatus = TIMEOUT ;
char *start ;
memset(voltage, 0, EC20_VOL_LEN+1);
runStatus = EC20_SendModuleCmd(QUERYVOLTAGE, NULL ) ;
if( RUNOK == runStatus )
{
start = strrchr( (const char*)ec20AtBuf, ',' ) ;
CopyValues((uint8_t*)voltage, (uint8_t*)start+1, 0x0D, EC20_VOL_LEN) ;
}
return (runStatus) ;
}