拷贝这两个文件到自己的工程
测试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=0,*StrStop=0,len=0; len = strlen(StrBegin);//字符串长度 StrStart=strstr(Str, StrBegin);//第一个字符串开始的地址 if(StrStart) { StrStop = strstr(StrStart+len+1, StrEnd);//第二个字符串开始的地址 if(StrStop) { StringStr = (char *)malloc(((StrStop - (StrStart+len))+1) *sizeof(char));//多分配一个空间,防止其它数据干扰 memset(StringStr,NULL,(StrStop - (StrStart+len))+1); 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 = 0; if (src == NULL || strlen(src) == 0) return; if (separator == NULL || strlen(separator) == 0) 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,0,strlen(MAC)); //»ñÈ¡MAC_CUR:" ºÍ " Ö®¼äµÄ×Ö·û´® Str = StrBetwString(data,"MAC_CUR:\"","\"");//+CIPSTAMAC_CUR:"dc:4f:22:10:b8:fc" cStringFree();//ÊÍ·ÅcStringº¯ÊýËùÓÃÄÚ´æ if((Str!=NULL) && strlen(Str) == 17)//»ñÈ¡ÁËÊý¾Ý { sprintf(MAC,"%s",Str);//¿½±´Êý¾Ý split(Str,":",NULL,&Len);//·Ö¸îdc:4f:22:10:b8:fc if(Len == 6)//·Ö¸î³öµÄ×Ö´®Îª6 { //ÊÇÕýÈ·µÄÊý¾Ý¿ÉÒÔ·¢ËÍÏÂÒ»ÌõÊý¾Ý(ÒÔϳÌÐò¹Ì¶¨) DataReturnFlage=1; ConfigModuleNoBlockCnt = (SendNextDelay == 0 ? ConfigModuleNoBlockCnt:SendNextDelay); } } }
这两句代码不要动!
如果判断数据处理成功,就写上这两句就可以.
最后一个参数
这个参数是控制如果当前指令返回正确,控制发送下一条数据的时间
写 CompareValue 就是如果返回想要的下一条立即发送
如果不希望下一条立即发送,可以写 0 - CompareValue 的值
延时时间为 (CompareValue - 你输入的值 ) Ms
如果想控制一个引脚输出高电平 延时10s
然后控制这个引脚输出低电平
现在说一下如何控制重新配置
假设 串口接收到 CLOSED 咱需要重新配置
为了实现那个效果,我连接我的TCP服务器,然后大约20秒,服务器会自动断开连接,然后WIFI就会打印 CLOSED
测试:
然后说一下
如果你希望程序一开始进来的时候不希望程序执行