• 单片机模块化程序: 单片机AT指令配置模块程序模板(非阻塞版)


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

     

     

    测试1://单片机发送AT+RST  如果单片机串口接收到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

    测试:

    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

     

    然后说一下

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

  • 相关阅读:
    【bzoj2242】[SDOI2011]计算器
    1109解题报告
    【bzoj3239】Discrete Logging
    【bzoj2480】Spoj3105 Mod
    【POJ1811】Prime Test
    【bzoj3667】Rabin-Miller算法
    【HDU2138】How many prime numbers
    卢卡斯定理
    线段树2
    畅快的甩卖
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/11674814.html
Copyright © 2020-2023  润新知