Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2921|回复: 0

13-单片机AT指令配置模块程序模板(非阻塞版)

[复制链接]

56

主题

56

帖子

224

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
224
发表于 2020-9-21 10:04:18 | 显示全部楼层 |阅读模式



拷贝这两个文件到自己的工程
819239-20191014223143795-51446073.png



819239-20191014223206591-607437730.png



819239-20191014223618866-1979272515.png




819239-20191014223723150-675334800.png

819239-20191014223841940-434224344.png


测试1://单片机发送AT+RST  如果单片机串口接收到OK 或者ready 执行下一条
819239-20191014224139038-2117928793.png



测试2: 平时发送数据的时候有时候需要先执行一些函数打包数据,然后再发送
为了直观,我做的单片机控制WIFI连接路由器的程序
819239-20191014225851483-2077945125.png



819239-20191014225921716-1957283676.png




测试3: 有时候需要获取一下模块返回的数据,咱获取WIFI的MAC地址
既然获取MAC,就需要对字符串处理,给大家我写的常用的函数
819239-20191015001650925-106101597.png




/**
  ******************************************************************************
  * @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;
}

819239-20191015001817590-516970664.png




819239-20191015001857307-1735810727.png




然后说一下,
819239-20191015002837360-378224251.png


/**
* @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);
        }
    }
}



这两句代码不要动!


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

最后一个参数
819239-20191015003004834-1727493905.png



819239-20191015003318927-1399658945.png




这个参数是控制如果当前指令返回正确,控制发送下一条数据的时间  
写 CompareValue  就是如果返回想要的下一条立即发送
如果不希望下一条立即发送,可以写 0 - CompareValue  的值
延时时间为 (CompareValue  - 你输入的值 ) Ms

如果想控制一个引脚输出高电平 延时10s
然后控制这个引脚输出低电平
819239-20200313064357820-866628302.png










现在说一下如何控制重新配置
假设 串口接收到 CLOSED  咱需要重新配置
819239-20191015005613471-1040353783.png



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




测试:

然后说一下
819239-20191015010504871-767522202.png



如果你希望程序一开始进来的时候不希望程序执行
819239-20191015011040595-1658867925.png

copycode.gif
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2020-10-31 18:42 , Processed in 0.088775 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表