#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[
ERROR0, 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 1sprintf(post_content,"{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":%0.1f}]}]}", (char*)DATA_STREAM, post_value_point);#elsestrcat(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, "}]}]}");#endifsprintf(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 0uint8_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);
#endifchar 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));
}

SIM800C我的风格-看流程AT相关推荐

  1. 话里话外:简单看流程

    博主推荐 流程经理人联合会文章 流程是什么?怎样理解流程在企业管理中的重要性?流程管理能发挥多大的作用?关于流程的许多问题在众多管理理论研究书籍中,我们常常可以见到,然而理论化的知识往往晦涩难懂,而且 ...

  2. 飞鱼游戏校招美术上岸指南?看这篇就够

    随着美术面试的同学第108次问校招面试官美术风格/研发流程/培养机制后,我觉得事情不能再这样下去了. 在某次校招面试后,我追着拉住了校招美术面试官--薛老师的衣袖,问:我可以采访一下你吗? 鱼鱼子:校 ...

  3. php5.3教程,PHPwind 5.3 官方风格教程

    PHPwind Forums 5.3 的独特模板设计,使你简单设置几个变量即可以更换整个模板的主体风格! 一.PHPwind Forums 5.3 的独特模板设计,几个好处 1.大框架采用div+cs ...

  4. 【拒绝一问就懵】之Activity的启动流程

    背景介绍 从事开发到了一定阶段,想要提高就必须搞明白系统的一些工作原理.为什么?因为只有明白了这些,你才能针对平台的特性写出优质的代码.当遇到棘手的问题时,你才能更快速的结合系统原理去寻找最优解决方案 ...

  5. linux转换C编码风格

    在 Linux 下,比较流行的"行业"风格有 KR 的编码风格.GNU 的编码风格.Linux 内核的编码风格(基于 KR 的,缩进是 8 个空格)等,它们都可以通过 indent ...

  6. Spring bean的生命流程

    2019独角兽企业重金招聘Python工程师标准>>> Spring 是一个轻量级的 J2EE 开源框架,其目标是降低企业级应用开发难度,提高企业级应用开发效率.在日程开发中,我们会 ...

  7. 目前流行的装修风格_当下最流行十种装修风格,总有一款适合你!

    需求越来越流行,装修行业也是花样百出,欧式.美式.中式.日式--各种风格看的眼花缭乱. 每个人都有自己独特的审美和情趣,业主对装修风格的倾向和确认,可以让设计师更容易在把握整体风格的基础上做出满足客户 ...

  8. Android 7.0 Keyguard流程分析

    在android 6.0 上Keyguard作为了SystemUI的一个库文件被引用,所以编译的时候不会出现Keyguard.apk这个文件,Keyguard也伴随着SystemUI的启动而启动,其中 ...

  9. Android构建流程——篇四

    文章目录 Task9 generateDebugResValues 1. input/ouput 2. 核心类(GenerateResValues) Task10 generateDebugResou ...

最新文章

  1. 如何写出符合Python审美的代码风格?
  2. linux bash sh,linux bash shell.sh编程实例
  3. 【数字信号处理】相关函数 ( 相关函数性质 | 相关函数共轭对称性质 | 实信号自相关函数偶对称 | 复信号自相关函数共轭对称 | 复信号互相关函数共轭对称 )
  4. 【STM32】端口复用和重映射,完全重映射,部分重映射
  5. TypeError: 'function' object is not subscriptable
  6. 对话框 未能返回新代码元素 可能 没有ncb_JDK1.8的新特性 | 技术
  7. 五个简单的原则,带你写出整洁代码
  8. 都是基于.NET平台,WPF能取代Winform吗?
  9. python基本语法1.2--数的移位及与或抑或相关计算
  10. 高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)
  11. java 查看虚拟机状态_深入理解java虚拟机学习笔记(四)虚拟机性能监控与故障处理工具...
  12. 15 Process State and O.S. Scheduling
  13. C语言文件的随机读写
  14. matlab求解scara运动空间,SCARA机器人直线运动下的极限点求解算法
  15. 开着代理的情况下,Win10 UWP 应用无法联网
  16. java 微信分享朋友圈 链接显示图片_分享网页到微信朋友圈,显示缩略图的方法...
  17. 超详细实现淘宝静态页面(附全部代码)
  18. AtCoder Beginner Contest 168 C~D题解
  19. [思语]_我心中的大师
  20. 取模后的余数,向负无穷方向舍入

热门文章

  1. 机器学习-降维算法(MDS算法)
  2. UltraISO使用步步通
  3. 第七届电工专项 如何进行检验
  4. 信息自动发布系统的使用教程
  5. PHP判断今天昨天前天
  6. for...in 和 for...of 的区别
  7. 湖南计算机研究生学校排名,湖南全部128所大学排名,分为9个档次,你理想的大学排在第几档?...
  8. “我曾认为开源是有钱闲人的游戏,不要试图快速从中变现” | 对话《大教堂与集市》译者卫剑钒...
  9. 新能源高级别故障-热失控
  10. 具有优化头寸退出规则的货币对交易