本帖最后由 HuangHongLun 于 2019-10-31 19:11 编辑
测试3: 有时候需要获取一下模块返回的数据,咱获取WIFI的MAC地址 既然获取MAC,就需要对字符串处理,给大家我写的常用的函数
- /**
- ******************************************************************************
- * [url=home.php?mod=space&uid=288409]@file[/url] String.c
- * [url=home.php?mod=space&uid=187600]@author[/url] yang feng wu
- * [url=home.php?mod=space&uid=895143]@version[/url] V1.0.0
- * [url=home.php?mod=space&uid=212281]@date[/url] 2019/10/13
- * [url=home.php?mod=space&uid=247401]@brief[/url] 字符串处理函数
- ******************************************************************************
- ******************************************************************************
- */
- #define CSTRING_C_
- #include "include.h"
- char *StringStr = NULL;
- void cStringFree(void){
- free(StringStr);
- }
- /**
- * @brief 获取两个字符串之间的字符串
- * @param Str 源字符串
- * @param StrBegin 开始的字符串
- * @param StrEnd 结束的字符串
- * @retval 字符串首地址
- * [url=home.php?mod=space&uid=389923]@example[/url] 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;
- }
测试: 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_002018.mp4
然后说一下,
- /**
- * @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
现在说一下如何控制重新配置 假设 串口接收到 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
然后说一下
如果你希望程序一开始进来的时候不希望程序执行
|