SIM800C我的风格-看流程AT

#include "sim800c.h"
#include "gtimer.h"
#include "gkbaseusart.h"

void post_data_stream_to_onenet(void);
char Sim_Init(void);
static GK_USARTBASE_TYPE *puart=NULL;
//++++++++++++使用串口框架+++++++++++//
typedef struct
{
	volatile uint8_t  start;
    volatile uint32_t count;
    volatile uint8_t  idle;
}timeflagtype;

timeflagtype tflg;


#define RECEIVE_MAX 2048
typedef struct
{
    uint16_t len;
    char rxBuff[RECEIVE_MAX];
}lbDataType;

lbDataType udata;
//++++++++++++使用串口框架+++++++++++//

//一共3个脚
#define SIMRST_GPIO_Port GPIOB
#define SIMRST_Pin       GPIO_PIN_2
#define	SIMRST1          HAL_GPIO_WritePin(SIMRST_GPIO_Port, SIMRST_Pin, GPIO_PIN_SET);
#define	SIMRST0          HAL_GPIO_WritePin(SIMRST_GPIO_Port, SIMRST_Pin, GPIO_PIN_RESET);

void usart_timer_isr(void)
{
	if( tflg.start)
	{
		if( tflg.count++ > 3 )
		{
            memset(&tflg,0,sizeof(timeflagtype));  
            tflg.idle =1;
		}
	}
}
void modesimRXbyte(uint8_t ch)
{
    tflg.start=1;
    tflg.count=0;
    udata.rxBuff[udata.len++%RECEIVE_MAX]=ch;
}

uint8_t rxbuf[200];
void puart_init(void)
{
  if( (puart = GK_usart_read_obj(2))==NULL)SHOWME;		
  GK_usart_init(puart,2,rxbuf,modesimRXbyte);

}
void modesim_resert( void )
{
	SIMRST1;
	HAL_Delay(300);
	SIMRST0;
	HAL_Delay(400);
    SHOWME
//这兄弟是低电平开机!和ESP8266不同!   
}
void modesim_init(void)
{
	static time_type T;
	puart_init();
    memset(&tflg,0,sizeof(timeflagtype));
    timer.creat(&T, 10,1 , usart_timer_isr);
	modesim_resert(); 
}

void modesim_send(uint8_t *TX , uint16_t TXlen  )
{
    puf->tx(puart, TX, TXlen);
}

void modesim_clear(void)
{
    memset(&udata,0,sizeof(lbDataType));
	memset(&tflg,0,sizeof(timeflagtype)); 
}
uint8_t modesim_TXRX_L1(uint8_t *TX , uint16_t TXlen , uint8_t *RX,uint16_t *RXlen )
{
	uint8_t Cnt = 100,ack=0;

    memset(&udata,0,sizeof(lbDataType));
	memset(&tflg,0,sizeof(timeflagtype));

    modesim_send(TX,TXlen);

	while(Cnt--)
	{	
		HAL_Delay(50);	
		if(tflg.idle)
		{
            *RXlen=udata.len;
            memcpy(RX,udata.rxBuff,udata.len);
			ack=1;
			break;
		}
        HAL_Delay(10);	
        //printf("Cnt=%d\r\n",Cnt);
	}
    memset(&udata,0,sizeof(lbDataType));
	memset(&tflg,0,sizeof(timeflagtype));

    if(ack==0)
	return 0; 
   		
    printf("TX[%s]\r\n",TX);
    printf("RX[%s]RXLEN=%d \r\n",RX,*RXlen);
	return 1;  
}

//TXRX 携带返回比较
uint8_t modesim_TXRX_L2(void *tx , uint16_t length ,  uint8_t repert , void *checkData)
{
    uint8_t *TX = (uint8_t *)tx;
    char *CHK   = (char *)checkData;
	char RX[200]={0};
	uint16_t RXLEN=0;

    while (1)
    {
      if(CHK==NULL)
      {
         printf("ONLY TX [%s]\r\n",TX);
         modesim_send(TX,length);
         return 1;
      }
 
	  memset(RX,0,sizeof(RX));
      memset(rxbuf,0,sizeof(rxbuf));
      if( modesim_TXRX_L1(TX , length ,(uint8_t*)RX , &RXLEN) )
      {

            if( strstr (RX , CHK) != NULL)
            {
              return 1;
            }
     
      }

      if(repert != 0xFF)
      {
        if( --repert == 0 )return 0;
        //printf("repert=%d\r\n",repert);
      }

    }

}


uint8_t  modesim_power_on( void )
{
    printf("\r\n%s\r\n",__FUNCTION__);

    char *TX="AT\r\n";
    uint16_t TXlen=strlen(TX);
    char *checkData ="\r\nOK\r\n";
    if(modesim_TXRX_L2(TX,TXlen,20,checkData))
    {          
        printf("GSM开机成功\n");
        return 1;
    }
    printf("GSM开机失败\n");
    return 0;			
}


#include "sim_init_touch.h"
void gsmtest(void)
{

	modesim_init();

    Sim_Init();

    post_data_stream_to_onenet();
}






//++++++++++GKOSON风格++++++++++++++//

typedef struct _AtType_
{
    char   * At;
    char   * Chk;
}_AtType;

const _AtType AtBank []={
{"AT\r\n",                            "\r\nOK\r\n"},
{"ATE0\r\n",                          "\r\nOK\r\n"},
{"AT+IPR=115200\r\n",                 "\r\nOK\r\n"},
{"AT+CPIN?\r\n",            "\r\n+CPIN: READY\r\n"},
{"AT+CSQ\r\n",                        "\r\nOK\r\n"},
{"AT+CREG=0\r\n",                     "\r\nOK\r\n"},
{"AT+CREG?\r\n",              "\r\n+CREG: 0,1\r\n"},//回答很多次CREG: 0,2最后终于回答CREG: 0,1
{"AT+CGATT=1\r\n",                    "\r\nOK\r\n"},//回答很多次ERROR最后终于回答OK
{"AT+CGATT?\r\n",              "\r\n+CGATT: 1\r\n"},
{"AT+CIPQSEND=0\r\n",                 "\r\nOK\r\n"},
{"AT+CIPMUX=1\r\n",                   "\r\nOK\r\n"},//一次OK  =0是单链接 =1是多连接
{"AT+CIPMUX?\r\n",                    "+CIPMUX: 1"},//一次OK
{"AT+CIPSHUT\r\n",               "\r\nSHUT OK\r\n"},
{"AT+CSTT=\"cmiotqipeng.js\"\r\n"     "\r\nOK\r\n"},
{"AT+CIICR\r\n",                      "\r\nOK\r\n"},
{"AT+CIFSR\r\n",                               "."},//10.4.242.173
{"AT+CIPCLOSE=?\r\n",                         "\r\nOK\r\n"},
{"AT+CIPSTART=0,\"TCP\",\"183.230.40.33\",80\r\n",  "0, ALREADY CONNECT"},//ONENET 
};
/*连接ONENET不容易一次成功 
一般如下:TX以后不会立刻回答连接状态 而是马上回OK 过来很久很久才回答0, CONNECT OK
而我是急性子 我TX以后只拿到OK 我就再次TX 所以我拿到ALREADY CONNECT 
TX[AT+CIPSTART=0,"TCP","183.230.40.33",80
]
RX[
OK
]RXLEN=6 
TX[AT+CIPSTART=0,"TCP","183.230.40.33",80
]
RX[
ERROR

0, ALREADY CONNECT

*/

#define	fun_chk( fun,id)	\
  do{\
    if( (fun) )\
      { \
        printf("Function i=%d OK\r\n\r\n\r\n\r\n",id);\
        id++;\
       }\
    else {\
			printf("Function i=%d Failed \r\n",id);\
			{\
             errcount++ ;\
			}\
		}\
  }while(0)

char Sim_Init(void)
{
	uint16_t TXlen=0,i=0;
	char *TX = NULL;
	char *RXCHK = NULL;
	uint8_t rst=0,errcount=0;
	for(i=0;i<sizeof(AtBank)/sizeof(*AtBank);)
	{
				 TX    = AtBank[i].At;
				 TXlen = strlen(TX);
				 RXCHK = AtBank[i].Chk;
                 errcount=0;
				 rst = modesim_TXRX_L2(TX , TXlen ,10, RXCHK);
				 fun_chk(rst,i);
                 if(errcount==20)
                 {printf("errcount==20 retry\r\n");modesim_resert();i=0;}
	}
	printf("\r\n\r\n\r\n###########GO TO NEW WORLD########\r\n\r\n\r\n");
	return 0;
}





#define DEVICE_ID	"534329033"	
#define API_KEY		"xdMnSkJ6sTk9OUI5A1vjE7f41SI="
#define DATA_STREAM	"SIM800C"

char   g_post_data_src[512];
float  gvalue = 12;

void post_data_process(char *dev_id, char *api_key)
{
	float post_value_point = 0.0;
	char post_content[256];
	char post_content_len[4];
	
	memset(post_content, 0, sizeof(post_content));
	memset(g_post_data_src, 0, sizeof(g_post_data_src));
	
	post_value_point = gvalue++;
	#if 1
	sprintf(post_content,"{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":%0.1f}]}]}", (char*)DATA_STREAM, post_value_point);
	#else
	strcat(post_content, "{\"datastreams\":[{\"id\":\"");
	strcat(post_content, g_post_data_stream_name);
	strcat(post_content, "\",\"datapoints\":[{\"value\":");
	strcat(post_content, g_post_value_point);
	strcat(post_content, "}]}]}");
	#endif
	sprintf(post_content_len, "%d", strlen(post_content));
	
	strcat(g_post_data_src, "POST /devices/");
	strcat(g_post_data_src, dev_id);
	strcat(g_post_data_src, "/datapoints HTTP/1.1\r\n");
	strcat(g_post_data_src, "api-key:");
	strcat(g_post_data_src, api_key);
	strcat(g_post_data_src, "\r\n");
	strcat(g_post_data_src, "Host:api.heclouds.com\r\n");
	strcat(g_post_data_src, "Content-Length:");
	strcat(g_post_data_src, post_content_len);
	strcat(g_post_data_src, "\r\n\r\n");
	strcat(g_post_data_src, post_content);
	strcat(g_post_data_src, "\r\n\r\n");
	
	printf("\r\n[%s]\r\n", g_post_data_src);
}


void SIM_TX(uint8_t ID,char *msg,uint8_t len)
{    
#if 0
		uint8_t comm[64] , cmdLength =0 ;
		uint8_t id=ID;
		memset(comm ,0x00 , sizeof(comm));
		cmdLength = sprintf((char *)comm , "AT+CIPSEND=%d,%d\r\n" , id ,len);
		modesim_send(comm , cmdLength);
		HAL_Delay(200);       
        modesim_clear();
		modesim_send((uint8_t *)msg ,len );
        HAL_Delay(200);
#endif
        char tx[64] ,rx[64], atlen =0 ;
		uint8_t id=ID;
        memset(tx ,0x00 , sizeof(tx));
        memset(rx ,0x00 , sizeof(rx));
        atlen = sprintf(tx , "AT+CIPSEND=%d,%d\r\n" ,      id ,len);
                //sprintf(rx , "\r\nDATA ACCEPT:%d,%d\r\n" , id ,len);
                sprintf(rx , "\r\n>" );
        _AtType At={tx,rx};

        while(modesim_TXRX_L2(At.At , atlen ,50, At.Chk)==0)
        {
            printf("AT SEND WITHOUT BACK > NOW TRY ANGIN\r\n");
            HAL_Delay(50);
        }

        printf("AT SEND OK NOW SEND MSG\r\n");
        modesim_send((uint8_t *)msg ,len );
}

void post_data_stream_to_onenet(void)
{
	post_data_process(DEVICE_ID, API_KEY);
	SIM_TX(0, g_post_data_src, strlen(g_post_data_src));
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值