拷貝這兩個文件到自己的工程
測試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
測試:
然后說一下
如果你希望程序一開始進來的時候不希望程序執行