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

资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git

点击加入群聊【单片机,物联网,上位机】:ESP8266开发交流群

说明1:知识从未如此性感。 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系!

说明2:学的是思想,而非程序!此代码思路适用于所有的单片机。

说明3:学会以后,下面的代码可能会跟你一辈子!

说明4:这一系列文章是为大幅度裁剪本人博客文章!使博客文章更有条理。便于推其它教程!

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

测试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

 

然后说一下

 

 

 

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

 

 

 

 

 

 

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 单片机 AT 指令处理程序是用于处理 AT 指令程序,一般用于与模块通信,如 GSM 模块或蓝牙模块等。在单片机开发中,使用 AT 指令可以简化通信和控制的过程。 处理 AT 指令程序一般包括以下几个步骤: 1. 接收指令程序需要接收从外部设备发送过来的 AT 指令。可以通过串口或者其他通信接口进行接收。 2. 解析指令:接收到的指令一般是字符串形式,程序需要对其进行解析。解析过程可以使用字符串处理函数,根据指令的格式和命令码进行解析,提取出指令的参数和控制命令。 3. 执行指令:根据解析出来的指令参数和控制命令,程序需要执行相应的操作。例如,如果是发送 SMS 指令程序需要将指定的文本信息发送给指定的手机号码。 4. 反馈结果:执行完指令后,程序需要返回执行结果给外部设备。可以通过串口或其他通信方式将结果发送出去。结果可以是执行成功或失败的提示信息,或者是返回的数据结果。 单片机 AT 指令处理程序的设计和实现需要根据具体的需求和硬件平台进行调整。程序应该具备良好的可扩展性和鲁棒性,以方便后续功能的增加和修改。同时,程序还应提供适当的错误处理机制,以便处理意外的异常情况。 总之,单片机 AT 指令处理程序是一个重要的通信模块,可以方便地与外部设备进行通信和控制。有效地设计和实现该程序能够提高系统的可靠性和稳定性,提高开发效率。 ### 回答2: 单片机AT指令处理程序是指在单片机中编写的程序,用于解析和处理接收到的AT指令。AT指令是一种用于与模块通信的指令集,常用于控制和配置移动通信设备,如GSM模块或蓝牙模块。 AT指令处理程序的基本流程如下: 1. 初始化:首先,需要设置单片机的串口通信参数,如波特率、数据位、停止位等。这样单片机才能正确接收和发送AT指令。 2. 接收:通过串口接收来自外部设备的AT指令单片机需要实时监测接收缓冲区,以便及时处理接收到的指令。 3. 解析:对接收到的AT指令进行解析,提取其中的命令和参数。可以使用字符串处理函数来实现解析过程,将指令和参数分离出来,以便后续的处理。 4. 处理:根据解析得到的命令和参数,进行相应的处理操作。例如,可以根据AT指令的不同,调用相应的功能函数来实现相应的功能。这些功能函数可以包括发送短信、拨打电话、配置网络参数等。 5. 响应:根据处理结果,生成相应的响应消息,并通过串口发送给外部设备。AT指令的响应消息通常以固定的格式进行回复,以便外部设备能够正确解析。 单片机AT指令处理程序的编写需要熟悉AT指令的规范和功能需求。同时,还需要掌握单片机的串口通信相关知识和相应的编程技巧。编写完成后,通过测试和调试,可以确保程序可以正确解析和处理各种AT指令,并返回正确的响应消息,从而实现单片机与外部设备的通信和控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值