拷贝这两个文件到自己的工程

测试1://单片机发送AT+RST\r\n  如果单片机串口接收到OK 或者ready 执行下一条

测试2: 平时发送数据的时候有时候需要先执行一些函数打包数据,然后再发送

为了直观,我做的单片机控制WIFI连接路由器的程序

测试3: 有时候需要获取一下模块返回的数据,咱获取WIFI的MAC地址

既然获取MAC,就需要对字符串处理,给大家我写的常用的函数

/**
******************************************************************************
* @file String.c
* @author yang feng wu
* @version V1.0.0
* @date 2019/10/13
* @brief 字符串处理函数
****************************************************************************** ******************************************************************************
*/
#define CSTRING_C_
#include "include.h" char *StringStr = NULL;
void cStringFree(void){
free(StringStr);
} /**
* @brief 获取两个字符串之间的字符串
* @param Str 源字符串
* @param StrBegin 开始的字符串
* @param StrEnd 结束的字符串
* @retval 字符串首地址
* @example printf("%s",StrBetwString("wqe5w4ew46e5w","5w","6e"));cStringFree(Str); 输出:4ew4
**/
char *StrBetwString(char *Str,char *StrBegin,char *StrEnd)
{
char *StrStart=,*StrStop=,len=;
len = strlen(StrBegin);//字符串长度 StrStart=strstr(Str, StrBegin);//第一个字符串开始的地址
if(StrStart)
{
StrStop = strstr(StrStart+len+, StrEnd);//第二个字符串开始的地址
if(StrStop)
{
StringStr = (char *)malloc(((StrStop - (StrStart+len))+) *sizeof(char));//多分配一个空间,防止其它数据干扰 memset(StringStr,NULL,(StrStop - (StrStart+len))+);
memcpy(StringStr, StrStart+len, (StrStop - (StrStart+len))); return StringStr;
}
else
{
return NULL;
}
}
else
{
return NULL;
}
} /**
* @brief 分割字符串
* @param src 源字符串
* @param separator 分割
* @param dest 接收子串的数组
* @param num 子字符串的个数
* @retval None
* @example split("42,uioj,dk4,56",",",temp,&cnt); temp[0]=42,...temp[3]=56 cnt=4
**/
void split(char *src,const char *separator,char **dest,int *num)
{
char *pNext;
int count = ;
if (src == NULL || strlen(src) == )
return;
if (separator == NULL || strlen(separator) == )
return;
pNext = (char *)strtok(src,separator);
while(pNext != NULL)
{
if(dest != NULL)
*dest++ = pNext;
++count;
pNext = (char *)strtok(NULL,separator);
}
*num = count;
}

然后说一下,

/**
* @brief »ñÈ¡É豸MAC
* @param data
* @param
* @retval
* @example
**/
void FunctionParseGetMac(char *data)
{
char *Str;
int Len;
memset(MAC,,strlen(MAC)); //»ñÈ¡MAC_CUR:" ºÍ " Ö®¼äµÄ×Ö·û´®
Str = StrBetwString(data,"MAC_CUR:\"","\"");//+CIPSTAMAC_CUR:"dc:4f:22:10:b8:fc"
cStringFree();//ÊÍ·ÅcStringº¯ÊýËùÓÃÄÚ´æ
if((Str!=NULL) && strlen(Str) == )//»ñÈ¡ÁËÊý¾Ý
{
sprintf(MAC,"%s",Str);//¿½±´Êý¾Ý
split(Str,":",NULL,&Len);//·Ö¸îdc:4f:22:10:b8:fc
if(Len == )//·Ö¸î³öµÄ×Ö´®Îª6
{
//ÊÇÕýÈ·µÄÊý¾Ý¿ÉÒÔ·¢ËÍÏÂÒ»ÌõÊý¾Ý(ÒÔϳÌÐò¹Ì¶¨)
DataReturnFlage=;
ConfigModuleNoBlockCnt = (SendNextDelay == ? ConfigModuleNoBlockCnt:SendNextDelay);
}
}
}

这两句代码不要动!

如果判断数据处理成功,就写上这两句就可以.

最后一个参数

这个参数是控制如果当前指令返回正确,控制发送下一条数据的时间

写 CompareValue  就是如果返回想要的下一条立即发送

如果不希望下一条立即发送,可以写 0 - CompareValue  的值

延时时间为 (CompareValue  - 你输入的值 ) Ms

如果想控制一个引脚输出高电平 延时10s

然后控制这个引脚输出低电平

现在说一下如何控制重新配置

假设 串口接收到 CLOSED  咱需要重新配置

为了实现那个效果,我连接我的TCP服务器,然后大约20秒,服务器会自动断开连接,然后WIFI就会打印 CLOSED

测试:

https://qqqqqbucket.oss-cn-beijing.aliyuncs.com/%E5%8D%95%E7%89%87%E6%9C%BA%E6%A8%A1%E5%9D%97%E5%8C%96%E7%A8%8B%E5%BA%8F/%E5%8D%95%E7%89%87%E6%9C%BAAT%E6%8C%87%E4%BB%A4%E9%85%8D%E7%BD%AE%E6%A8%A1%E5%9D%97%E7%A8%8B%E5%BA%8F%E6%A8%A1%E6%9D%BF(%E9%9D%9E%E9%98%BB%E5%A1%9E%E7%89%88)/20191015_005932.mp4

然后说一下

如果你希望程序一开始进来的时候不希望程序执行

单片机模块化程序: 单片机AT指令配置模块程序模板(非阻塞版)的更多相关文章

  1. 应用程序初次运行数据库配置小程序(Java版)

    应用程序初始化数据库配置小程序 之前写过一个Java版的信息管理系统,但部署系统的时候还需要手动的去配置数据库和导入一些初始化的数据才能让系统运行起来,所以我在想是不是可以写一个小程序在系统初次运行的 ...

  2. 【转】单片机系统中数字滤波的算法【C程序整理】

    随机误差是有随机干搅引起的,其特点是在相同条件下测量同一个量时,其大小和符号做无规则变化而无法预测,但多次测量结果符合统计规律.为克服随机干搅引入的误差,硬件上可采用滤波技术,软件上可以采用软件算法实 ...

  3. Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基础文件配置,Web框架的本质,服务器程序和应用程序(wsgiref服务端模块,jinja2模板渲染模块)的使用

    Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基 ...

  4. Asp.net Mvc模块化开发之“部分版本部分模块更新(上线)”

    项目开发从来就不是一个简单的问题.更难的问题是维护其他人开发的项目,并且要修改bug.如果原系统有重大问题还需要重构. 怎么重构系统不是本文探讨的问题,但是重构后如何上线部署和本文关系密切.这个大家可 ...

  5. JAVA9模块化详解(二)——模块的使用

    JAVA9模块化详解(二)--模块的使用 二.模块的使用 各自的模块可以在模块工件中定义,要么就是在编译期或者运行期嵌入的环境中.为了提供可靠的配置和强健的封装性,在分块的模块系统中利用他们,必须确定 ...

  6. 51单片机和STM32单片机区别在那里

    ​大部分朋友可能都知道51单片机和stm32单片机也知道一般入门会先学习51单片机在学习stm32单片机会简单一些,但是对于51单片机和stm32单片机的具体区别却不知道了,有些人觉得没必要,但是我个 ...

  7. freeMarker(八)——程序开发指南之配置(Configuration)

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.基本内容 配置(configuration)就是 freemark ...

  8. STM32单片机和51单片机区别

    单片机 / AVR / PIC / STM32 / 8051803189C5189S51 6905 单片机简介 单片微型计算机简称单片机,简单来说就是集CPU(运算.控制).RAM(数据存储-内存). ...

  9. Javascript模块化编程(一):模块的写法

    Javascript模块化编程(一):模块的写法 作者: 阮一峰 原文链接:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html ...

随机推荐

  1. Kubernetes学习续之一键部署kubeadm

    1.Kubernetes的架构和组件,在部署时,它的每一个组件都是一个需要被执行的.单独的二进制文件,所以不难想象,SaltStack这样的运维工具或由社区维护的脚本的功能,就是要把这些二进制文件传输 ...

  2. C#读写修改设置调整UVC摄像头画面-缩放

    有时,我们需要在C#代码中对摄像头的缩放进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄像 ...

  3. 探索etcd,Zookeeper和Consul一致键值数据存储的性能

    这篇博文是探索三个分布式.一致性键值数据存储软件性能的系列文章中的第一篇:etcd.Zookeeper和Consul,由etcd团队所写,可以让我们全面地了解如何评估三个分布式一致存储软件的性能.翻译 ...

  4. C#中字符串转换为计算公式

    添加COM引用: private void button_Click(object sender, EventArgs e) { MSScriptControl.ScriptControl sc = ...

  5. 拷贝 vs 赋值

    其实我只要关注两个动作就够了: 拷贝.赋值=            (而构造.析构的步骤都是没疑问的.) ——>   赋值=  都是显式调用的, 而拷贝构造可以显示调,也可能隐式被调. 下图错误 ...

  6. 如何在JIRA中有效使用关注和@提及 我正在关注的问题 提及我的问题 在仪表板上显示

    如何在JIRA中有效使用关注和@提及http://bbs.51testing.com/forum.php?mod=viewthread&tid=1157043&fromuid=1530 ...

  7. drf--视图家族

    目录 drf 视图家族 前期准备 总路由 urls.py 基表:utils/models.py 模型层 api/models.py 序列化器 api/serializers.py 基本视图(views ...

  8. Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request对象方法,属性和Response对象,form表单的上传

    Django---CBV和FBV的使用,CBV的流程,给视图加装饰器,Request请求对象方法,属性和Response响应对象,form表单的上传 一丶CBV和FBV       在Django中存 ...

  9. 用jQuery的offset()替代javascript的offset

    在项目中遇到了一个问题,获取某个块状元素的offsetTop和offsetLeft时候会出现问题,并不是相对浏览器的位置,而是相对于某一个块状元素的位置,具体参照元素也没找到,因为页面中没有设置pos ...

  10. 在ZYNQ上裸机跑ARM程序的演示

    今天给大家演示如何在ZYNQ上,裸机跑ARM程序,本测试用的是米尔Z-turn Board单板,测试代码用的XILINX官方的C语言测试程序,用于测试挂接在ARM总线上的设备是否正常,并在串口终端打印 ...