精华内容
下载资源
问答
  • STM32+通信模组的通用AT指令框架,简单修改即可移植。
  • AT指令框架

    2021-04-16 16:11:57
    借着写nbiot项目时,便自己写了统一的AT指令框架,便于以后对于通讯模块的统一维护。 思路: 结合状态机原理,建立一个二维数组,即表格样式。里面分别存有at指令当前状态,下一状态,发送指令,接受正确应答指令,...

    通信模块:BC28
    主控:HC32F176KATA

    背景:
    在公司接受相应的通讯模块,发现要频繁的使用AT指令,然而公司使用的AT指令都是一条条的写的,需要逐条维护,十分麻烦。借着写nbiot项目时,便自己写了统一的AT指令框架,便于以后对于通讯模块的统一维护。

    思路:
    结合状态机原理,建立一个二维数组,即表格样式。里面分别存有at指令当前状态,下一状态,发送指令,接受正确应答指令,指令发送后没有应答的超时时间,重发次数,串口状态,以及特殊处理函数。
    特殊处理函数是用来处理非单纯应答正确即可的指令的,比如存储设备的imei号码,我把它放在读取到所有应答数据后的下一步执行。

    代码:
    定义串口的状态,以及要用到的at指令

    typedef enum
    {
        IDLE = 0,
        SUCCESS_REC,    //成功
    	TIME_OUT,       //超时
    	NO_REC          //未收到  
    } rec_state_t;
    
    typedef enum
    {
        AT = 0,               /*发送AT指令测试*/
        CFUN0,
        NCSEARFCN,
        NCONFIG1,
        NCONFIG2,
        NCONFIG3,
        NCONFIG4,
        NBAND,
        NCDP,
        QREGSWT,
        CFUN1,
        NCCID,
        CIMI,
        CGSN,
        CPSMS,   
        // CEDRXS, 
        NPTWEDRXS,
        NRB,
        CEREG,
        CGATT,
        NNMI,
        CSQ,
        QLWULDATA,
        FINISH
    } comd_state_e;
    

    定义at指令的状态机对象:

    typedef struct 
    {
        comd_state_e cur_state;     // 当前状态
        comd_state_e next_state;    // 下一个状态
        char AtSendStr[128];        // 发送字符串(AT命令)
    	char ATRecStr[128];         // 需要返回的正确字符串
        int  wait_time;             // 等待时间,单位为ms
        rec_state_t at_status;      // 接收状态
        int  try_cnt;               // 重试次数
        uint8_t (*recv_deal)(char* data, uint8_t len); //动作:需要对某些返回的数据记录或者错误处理
    
    }fsm_state_t;
    
    

    定义完整的at指令表格,程序基本按照表格里的at指令顺序执行

    fsm_state_t ATCmds[] = 
    {
        //参数分别为 
        //当前状态     下一个状态   向NB-IOT发送字符串(AT命令)、                     模块应该返回的正确指令、                          设置超时(毫秒)、AT指令接收状态、设置重发次数
    	{AT,          CFUN0,       "AT\r\n",                                         "OK",                                             10000, IDLE, 10,default_deal},// 发送at指令,确定模块是否正常
        {CFUN0,       NCSEARFCN,   "AT+CFUN=0\r\n",                                  "OK",                                             5000,  IDLE, 3, default_deal},// 关闭射频功能(不进行无线通讯)
        {NCSEARFCN,   NCONFIG1,    "AT+NCSEARFCN\r\n",                               "OK",                                             300,   IDLE, 3, default_deal},// 清除存储的频点
        {NCONFIG1,    NCONFIG2,    "AT+NCONFIG=CR_0354_0338_SCRAMBLING,TRUE\r\n",    "OK",                                             300,   IDLE, 3, default_deal},// 打开扰码控制
        {NCONFIG2,    NCONFIG3,    "AT+NCONFIG=CR_0859_SI_AVOID,TRUE\r\n",           "OK",                                             300,   IDLE, 3, default_deal},// 打开扰码控制
        {NCONFIG3,    NCONFIG4,    "AT+NCONFIG=AUTOCONNECT,TRUE\r\n",                "OK",                                             300,   IDLE, 3, default_deal},// 配置模块自动连接网络
        {NCONFIG4,    NBAND,       "AT+NCONFIG=CELL_RESELECTION,TRUE\r\n",           "OK",                                             300,   IDLE, 3, default_deal},// 小区重选
        {NBAND,       NCDP,        "AT+NBAND=5\r\n",                                 "OK",                                             300,   IDLE, 3, default_deal},// 设置频段为电信的频段
        {NCDP,        QREGSWT,     "AT+NCDP=221.229.214.202,5683\r\n",               "OK",                                             300,   IDLE, 3, default_deal},// 云平台接入ip地址及端口设置
        {QREGSWT,     CFUN1,       "AT+QREGSWT=1\r\n",                               "OK",                                             300,   IDLE, 3, default_deal},// 设置为1,模块在重启并连接到网络后会触发自动注册物联网平台
        {CFUN1,       NCCID,       "AT+CFUN=1\r\n",                                  "OK",                                             5000,  IDLE, 10, default_deal},// 开启射频功能
        {NCCID,       CIMI,        "AT+NCCID\r\n",                                   "OK",                                             300,   IDLE, 3, default_deal},// 确认sim卡是否存在
        {CIMI,        CGSN,        "AT+CIMI\r\n",                                    "OK",                                             300,   IDLE, 3, default_deal},// 返回 IMSI 码 
        {CGSN,        CPSMS,       "AT+CGSN=1\r\n",                                  "\r\n+CGSN:",                                     300,   IDLE, 3, default_deal},// 返回 IMEI 码
        {CPSMS,       NPTWEDRXS,   "AT+CPSMS=0\r\n",                                 "OK",                                             300,   IDLE, 3, default_deal},// PSM模式设置
        // {CEDRXS,      NRB,         "AT+CEDRXS=0,5\r\n",                              "OK",                                             300,   IDLE, 3, default_deal},// eDRX模式设置
        {NPTWEDRXS,   NRB,         "AT+NPTWEDRXS=3,5\r\n",                           "OK",                                             300,   IDLE, 3, default_deal},// eDRX模式设置   
        {NRB,         CEREG,       "AT+NRB\r\n",                                     "+QLWEVTIND:3",                                   60000, IDLE, 5, default_deal},// 模块重启
        {CEREG,       CGATT,       "AT+CEREG?\r\n",                                  "\r\n+CEREG:0,1",                                 5000,  IDLE, 10,default_deal},// 查询网络注册状态
        {CGATT,       NNMI,        "AT+CGATT=1\r\n",                                 "OK",                                             300,   IDLE, 3, default_deal},// 使能网络附着
        {NNMI,        CSQ,         "AT+NNMI=1\r\n",                                  "OK",                                             300,   IDLE, 3, default_deal},// 接收到一个下行消息后会发送新消息指示
        {CSQ,         FINISH,      "AT+CSQ\r\n",                                     "\r\n+CSQ:",                                      300,   IDLE, 3, CSQ_deal},// 查询信号强度
        {QLWULDATA,   FINISH,      "AT+QLWULDATA=",                                  "OK",                                             1000,   IDLE, 3, QLWULDATA_deal},// 发送数据
    	
    };
    

    接下来是AT指令的接收,发送函数:

    fsm_state_t cur = {0,0,0,0,0,0,0,0}; // 相当于一个游动指针,表示当前状态,执行完就更新
    
    static void At_send(fsm_state_t cmd)
    {
        if(cur.at_status == IDLE)
        {
            Uart_NB.Uart_SendString(cmd.AtSendStr,strlen(cmd.AtSendStr));
            at_recv_time = cmd.wait_time;
        }
    }
    
    
    static void At_recv(fsm_state_t *cmd)
    {
        uint8_t i;
    
        if(cur.try_cnt == 0) //发送次数用完处理
        {
            // 暂定初始化重来
            cur.at_status = NO_REC;
        }
        
        
        // 尚有发送次数时
        else 
        {
            if(at_recv_time > 0)  // 接收时间未超时
            {
                cur.at_status = NO_REC;   // 没收到数据
    
                //while( (Uart_NB.rx_flag != 1) && (at_recv_time > 0) );
                if(Uart_NB.rx_flag == 1) // 规定时间内nbiot串口接收到数据
                {
                    Uart_NB.rx_flag = 0;
                    memset(atbuff, 0, sizeof(atbuff));// 清空at指令接收缓存
                    for(i=0; i<Uart_NB.rx_cnt;i++)   // 接收到的数据复制到缓存
                    {
                        atbuff[i] = U1_RxBuffer[i];
                    }
                                                                    
                    if( strstr(atbuff, cmd->ATRecStr ) != NULL)
                    {
                        cur.at_status = SUCCESS_REC;  // 接收状态赋值为成功
                        cmd->recv_deal(atbuff, Uart_NB.rx_cnt);   // 接收nb模块数据处理
                        // 接收到数据后,更新当前执行状态机状态
                        cur.cur_state = cur.next_state;
                        cur.next_state = ATCmds[cur.cur_state].next_state;
                        cur.try_cnt = ATCmds[cur.cur_state].try_cnt;
                        cur.at_status = ATCmds[cur.cur_state].at_status;
                    }
                        Uart_NB.rx_cnt = 0;   //串口接收缓存清零
                }
            }
            
            else if(at_recv_time == 0)   // 超时处理
            {
                cur.try_cnt--;
                cur.at_status = IDLE;
            }            
        }
        
    }
    

    封装相应的初始化函数和任务函数,后续注册给相应的通讯模块,放进主循环即可:

    void AT_init()
    {
        cur.cur_state = ATCmds[AT].cur_state;
        cur.next_state = ATCmds[AT].next_state;
        cur.try_cnt = ATCmds[AT].try_cnt;
    }
    
    
    
    void At_task()
    {
        if(cur.cur_state != FINISH )
        {
           At_send(ATCmds[cur.cur_state]);
           At_recv(&ATCmds[cur.cur_state]);
        }
         ZD_NB_transfer();
    }
    
    展开全文
  • AT指令框架.rar

    2020-09-29 12:19:17
    该资源及源代码详细说明了基于串口AT指令交互时,mcu的处理流程及逻辑框架。该模块不仅能用在有操作系统的工程中,还可用于裸机开发的工程中,具有很好的可扩展性。
  • AT_Test_stm32at_AT指令框架_stm32at_at_AT指令框架.zip
  • AT_Test_stm32at_AT指令框架_stm32at_at_AT指令框架_源码.zip
  • 之前写NB、SIM、LORA模块程序的时候经常为AT指令头疼不已,用过百度来的AT框架,用过华为的AT框架,用过同事写的at框架。 百度出来的的五花八门,华为LiteOS的AT框架必须配合系统一起使用,同事写的看着最舒服,可是...
  • AT指令框架的实现

    千次阅读 2018-11-22 11:23:18
    AT指令概述 AT指令是应用于终端设备与PC应用之间的连接与通信的指令。AT 即Attention。每个AT命令行中只能包含一条AT指令;对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度。 AT指令的格式 命令...

    AT指令概述

    AT指令是应用于终端设备与PC应用之间的连接与通信的指令。AT 即Attention。每个AT命令行中只能包含一条AT指令;对于AT指令的发送,除AT两个字符外,最多可以接收1056个字符的长度。

    AT指令的格式

    命令格式如下所示:

    AT[+CMD][=KEY]

    CMD:命令;
    KEY:参数的值,如果是?表示请求该参数的值,此处可有多个参数组成;

    用到的API函数简介

    char *strtok(char s[], const char *delim);

    分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。

    int atoi(const char *nptr);

    atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数,应用在计算机程序和办公软件中。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进)等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而在遇到非数字或字符串结束符('\0')才结束转换,并将结果返回。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0。特别注意,该函数要求被转换的字符串是按十进制数理解的。

    AT指令框架设计思路

    好的代码应该具有良好的封装和可读性,AT指令解释器的设计主要通过二级链表针对AT指令的特征对指令进行分类,提高指令索引效率,通过回调函数实现代码的良好封装。其中一级数据结构如下所示:

    
    typedef  struct MemShell_t {//指令成员
        char *Map;//指令保存区域
        uint16_t MapLength;//Map的长度
        uint8_t begin;//指令的首地址
        uint8_t end;//指令的结束地址
        void(*CallBack)(char *,uint16_t);//回调函数
        struct MemShell_t *Next;//下一个节点
    }MemShell_t, *MemShell_pt;

     

    转载---http://www.cnblogs.com/memorypro/p/9512129.html

    展开全文
  • 基于C语言的通用AT指令代码,含有详细的代码、解释及例子,可直接用于各模块的AT指令通信。
  • QT Linux实现AT指令处理框架

    千次阅读 2019-07-07 23:24:57
    看了下网上大多数人实现的在Linux下的4G模块AT指令收发控制,以及在QT上实现的,还有某些厂商实现的解析框架,其实就是在处理串口的收发,但未免做得有点糙,问题点也很多,比如很多人压根就没做指令回复的超时处理...

    本框架在QT4.8.6版本环境下编写。

    一、业务逻辑的诞生

    1.1 了解一下什么是AT指令

    在这里插入图片描述

    1.2 思考在QT上如何处理AT指令

    看了下网上大多数人实现的在Linux下的4G模块AT指令收发控制,以及在QT上实现的,还有某些厂商实现的解析框架,其实就是在处理串口的收发,但未免做得有点糙,问题点也很多,比如很多人压根就没做指令回复的超时处理,万一要是发生了,那将给整个程序带来致命性的伤害。
    最近的项目上需要在QT上处理AT指令的发送和回复,基于这样的环境,于是我决定实现两条线程,一条用于处理设备的初始化,一条用于处理在主进程指令的发送,由于AT指令收发存在延时,所以直接在主进程上延时,QT主进程就卡死了,这就是为什么我一定要用线程去处理的结果。

    1.3 特别提醒

    如果是在Linux操作串口设备,qt也要有相应的权限,使用如下指令即可。

    sudo qtcreator &
    

    二、移植通用串口框架到QT上

    由于QT4.8.6版本未有操作串口相关的类库,于是就只

    展开全文
  • stm32,AT指令程序

    2017-08-04 16:47:02
    GPRS通信模块和STM32,使用串口相连实现远程通信。
  • 基于AT指令的EC20的连接驱动,基于STM32F207主控芯片,具备重连功能和复位功能,复位引脚和串口需要重新定义映射;具备发送和接收缓存,独立的芯片操作任务;
  • AT指令解析框架 可以借助RTOS 实现方便 只需实现其中的信号量即可轻松移植
  • 史上最全的最完整的AT指令集详解
  • 本PDF文档描述了展讯的SM5100B-D模块所支持的AT指令集。
  • 每个AT都有7个成员,从左到右依次是旧的AT指令、新的AT指令、新的AT指令长度、测试回调函数、查询回调函数、设置回调函数、执行回调函数。 #ifndef __AT_BASETABLE_H #define __AT_BASETABLE_H #include "at.h" #...

    目录

    点击这里查看所有博文

      本系列博客所述资料均来自合宙官方,并不是本人原创(只有博客是自己写的),csdk只是得到了口头的允许公开授权。出于热心,本人将自己的所学笔记整理并推出相对应的使用教程,方面其他人学习。为国内的物联网事业发展尽自己的一份绵薄之力,没有为自己谋取私利的想法。若出现侵权现象,请告知本人,本人会立即停止更新,并删除相应的文章和代码。

      本系列博客基于紫光展锐的RDA8910 LTE Cat 1 bis芯片平台开发。理论上适用于合宙的Air720U、Air724U、广和通L610以及安信可的cat-01模块。

      各个厂家的部分配置文件可能不一样,也许会导致设备出现奇怪的问题,其他的模块我也不确定能不能用,自行测试。但是有一点编译下载和监视流程基本一样,可供参考。

      先不管支不支持,如果你用的模块是是紫光展锐的RDA8910,那都不妨一试,也许会有意外收获(也有可能变砖,慎重!!!)。

      我使用的是Air724UG开发板,如果在其他模块上不能用,那也不要强怼,也许是开发包不兼容吧。这里的代码是没有问题的。例程仅供参考!

    一、前言

      很累啊,最近太忙了。一直没时间折腾CSDK,回头一看足足有三个月没写新东西了。太长时间不写感觉都有点手生,拿起键盘都不知道怎么才能下手。

      这几天在CSDK上又折腾了下,搞了一个简易的AT引擎。合宙的CSDK默认也是支持一部分AT指令的,不是全部都支持,具体哪些不支持我也不是很清楚。

      除了合宙现有的一些AT指令外,有的小伙伴可能还希望在AT版本上面实现其他更复杂的操作,实现自定义的一些功能。而一般平台商提供的AT指令都是通用的,一般不会提供定制功能。直接让模块厂家去添加特定的AT指令可能性不大。甚至可以说基本不可能。

      比如有的小伙伴可能想要AT指令能够支持连接阿里云、腾讯云、百度云等等。而这些云平台一般都会有自己的鉴权算法,这些算法五花八门,并且还有可能会经常变动。合宙标准的AT指令也仅仅是提供了MQTT的连接命令,并没有针对这些平台提供具体的连接指令。这一类指令还好一点,受众挺广。以后可能会有,至于是什么时候谁都不知道,至少现在是没有的。

      现在没有的情况下,需要使用自定义的AT指令进行交互怎么办?
    在这里插入图片描述
      看到这个表情应该知道是什么意思了吧,不急的话继续往下看↓。

    二、简介

      今天带来的文章带来了一个简易的AT引擎。该AT引擎可以实现自定义AT指令、可以实现对固件自带的AT指令实现重定向、可以直接使用固件自带的AT指令。
    在这里插入图片描述

      第一类用法自定义AT:顾名思义自定义AT就是添加属于自己的AT。这个用法和底层的AT没关系。一般情况下AT指令会有四种用法,分别是测试(test)、查询(query)、设置(setup)、执行(exe)。上述是通用用法,但是有些AT指令只具备其中的一个或多个,并不是每个AT指令都会有上述四种用法。

    	AT+TEST=?			//测试指令。这一般情况下会返回该AT可以输入的参数取值范围
    	AT+TEST?			//查询指令。一般会返回AT指令之前设置的结果或者默认值
    	AT+TEST=123456		//设置指令。设置参数,设置的值可以被查询指令查询
    	AT+TEST				//执行指令。根据设置的结果执行相应的动作
    

      第二类用法重定向AT:相当于给底层自带的AT起一个别名。本例中我将对+WIMEI命令进行重定向,使用+REPWIMEI命令来代替+WIMEI,用法是一摸一样的只是名字变了。不要担心,这个并不会影响到原来的AT,原来的AT还是可以正常使用的。

      第三类用法转发AT,由于该模块默认串口1是AT口。我们实现自定义AT也是使用的串口1,这就会导致原来的AT通道不能正常使用。只能在AT引擎中将不匹配的AT通过VAT虚拟AT通道转发到底层处理。

    二、编写程序

    2.1、main.c

      demo非常简单,只需要调用at_task_init();我们的AT引擎就可以跑起来了。

    /***************
    	demo_at_engine
    ****************/
    
    
    #include "iot_debug.h"
    #include "iot_os.h"
    
    
    int appimg_enter(void *param)
    {
        iot_debug_print("[hello]appimg_enter");
    
        iot_debug_set_fault_mode(OPENAT_FAULT_HANG);
    
        iot_vat_send_cmd("AT^TRACECTRL=0,1,1\r\n", sizeof("AT^TRACECTRL=0,1,1\r\n"));
        at_task_init();//初始化AT引擎
        return 0;
    }
    
    void appimg_exit(void)
    {
        iot_debug_print("[hello]appimg_exit");
    }
    
    
    

      我们需要修改的内容在app\at_engine目录下,想要自定义命令需要修改三个文件,如果不修改的话默认也是可以跑的。
    在这里插入图片描述

    2.2、at_baseTable.h

      at_baseTable.h文件存放的是用户自定义AT以及重定向AT的一个表。At引擎运行的时候会到这个表中进行匹配。这个表实际上是一个结构体数组,一个结构体元素代表一个AT命令。每个AT都有7个成员,从左到右依次是旧的AT指令新的AT指令新的AT指令长度测试回调函数查询回调函数设置回调函数执行回调函数

    #ifndef __AT_BASETABLE_H
    #define __AT_BASETABLE_H
    
    #include "at.h"
    #include "at_baseCmd.h"
    
    at_funcationType at_fun[] = {
    	{NULL, "+NEW", 4, at_NEW_Cmdtest, at_NEW_Cmdquery, at_NEW_Cmdsetup, at_NEW_Cmdexe},
    	{"I", "+REPI", 5, NULL, NULL, NULL, NULL},
    	{"+WIMEI", "+REPWIMEI", 9, NULL, NULL, NULL, NULL},
    	{NULL, NULL, 0, NULL, NULL, NULL, NULL}};
    #endif
    

      如果旧的AT指令存在,说明该条目是对底层AT进行重定向。这时候只需要在填入新的AT指令新的AT指令长度即可,后面的四个回调都可以填NULL。实际填了也没用这并不会进入到这个回调中处理。

      如果旧的AT指令不存在,说明该条目是一条自定义指令,那就需要填入后面的回调,按需填写。用到哪个就填哪个。简介中有介绍到AT的四种用法。

      表中第1条:添加了一条AT+NEW指令,该条目是一个自定义指令,接下来还需要添加四个回调函数。at_NEW_Cmdtest, at_NEW_Cmdquery, at_NEW_Cmdsetup, at_NEW_Cmdexe
      表中第2条:使用AT+REPI指令完成对ATI的重定向。原始命令仍可正常使用。
      表中第3条:使用AT+REPWIMEI指令完成对AT+WIMEI的重定向。原始命令仍可正常使用。

    2.3、at_baseCmd.h

      at_baseCmd.h文件存放的是回调函数声明。

    #ifndef __AT_BASECMD_H
    #define __AT_BASECMD_H
    
    
    at_cmdResult at_NEW_Cmdtest(uint8_t id);
    
    at_cmdResult at_NEW_Cmdquery(uint8_t id);
    
    at_cmdResult at_NEW_Cmdsetup(uint8_t id, char *pPara);
    
    at_cmdResult at_NEW_Cmdexe(uint8_t id);
    
    #endif
    

    2.4、at_baseCmd.c

      at_baseCmd.c文件存放的是回调函数的具体实现。

    #include "at.h"
    #include "at_baseCmd.h"
    //#include "gsm.h"
    //执行AT命令
    //存储数据
    //上传
    at_cmdResult at_NEW_Cmdtest(uint8_t id)
    {
    	char buf[] = "AT+NEW TEST";
    	at_uart_send(buf, sizeof(buf) - 1);
    	return cmdResultOk;
    }
    at_cmdResult at_NEW_Cmdquery(uint8_t id)
    {
    	char buf[] = "AT+NEW QUERY";
    	at_uart_send(buf, sizeof(buf) - 1);
    	return cmdResultOk;
    }
    at_cmdResult at_NEW_Cmdsetup(uint8_t id, char *pPara)
    {
    	char *data = pPara + 1;
    	char buf[] = "AT+NEW SETUP pPara is: ";
    	at_uart_send(buf, sizeof(buf) - 1);
    	at_uart_send(data, strlen(data) - 2);
    	return cmdResultOk;
    }
    at_cmdResult at_NEW_Cmdexe(uint8_t id)
    {
    	char buf[] = "AT+NEW EXE";
    	at_uart_send(buf, sizeof(buf) - 1);
    	return cmdResultOk;
    }
    

    三、下载验证

      ATIAT+REPI测试,可以看到两条命令返回一样的结果。

    [2020-12-10 11:52:45.110]# SEND ASCII>
    ATI
    
    
    [2020-12-10 11:52:45.233]# RECV ASCII>
    
    CSDK_V301736_RDA8910
    
    OK
    
    
    [2020-12-10 11:52:51.295]# SEND ASCII>
    AT+REPI
    
    
    [2020-12-10 11:52:51.426]# RECV ASCII>
    AT+REPI
    
    CSDK_V301736_RDA8910
    
    OK
    

      AT+REPWIMEIAT+WIMEI测试,分别查询结果都是一样的。使用AT+WIMEI设置的新IMEI
    也能被AT+REPWIMEI查询到。

    
    [2020-12-10 11:56:18.597]# SEND ASCII>
    AT+REPWIMEI?
    
    
    [2020-12-10 11:56:18.736]# RECV ASCII>
    AT+REPWIMEI?
    
    +WIMEI: 866714049398888
    
    OK
    
    
    [2020-12-10 11:56:19.395]# SEND ASCII>
    AT+WIMEI?
    
    
    [2020-12-10 11:56:19.526]# RECV ASCII>
    
    +WIMEI: 866714049398888
    
    OK
    
    
    [2020-12-10 11:56:24.068]# SEND ASCII>
    AT+WIMEI=123456789123456
    
    
    [2020-12-10 11:56:24.257]# RECV ASCII>
    
    OK
    
    
    [2020-12-10 11:56:26.975]# SEND ASCII>
    AT+REPWIMEI?
    
    
    [2020-12-10 11:56:27.110]# RECV ASCII>
    AT+REPWIMEI?
    
    +WIMEI: 123456789123456
    
    OK
    
    

      AT+NEW测试,通过串口一日志看到AT的四种使用形式,测试(test)、查询(query)、设置(setup)、执行(exe)都被正常识别。

    
    [2020-12-10 11:58:12.083]# SEND ASCII>
    AT+NEW=?
    
    
    [2020-12-10 11:58:12.201]# RECV ASCII>
    AT+NEW=?
    
    AT+NEW TEST
    
    OK
    
    
    [2020-12-10 11:58:16.403]# SEND ASCII>
    AT+NEW?
    
    
    [2020-12-10 11:58:16.525]# RECV ASCII>
    AT+NEW?
    
    AT+NEW QUERY
    
    OK
    
    
    [2020-12-10 11:58:23.541]# SEND ASCII>
    AT+NEW=123456
    
    
    [2020-12-10 11:58:23.697]# RECV ASCII>
    AT+NEW=123456
    
    AT+NEW SETUP pPara is: 123456
    
    OK
    
    
    [2020-12-10 11:58:27.065]# SEND ASCII>
    AT+NEW
    
    
    [2020-12-10 11:58:27.179]# RECV ASCII>
    AT+NEW
    
    AT+NEW EXE
    
    OK
    

    不会下载的点击这里,进去查看我的RDA8910 CSDK二次开发入门教程专题第一篇博文1、RDA8910CSDK二次开发:环境搭建里面讲了怎么下载
    这里只是我的学习笔记,拿出来给大家分享,欢迎大家批评指正,本篇教程到此结束

    展开全文
  • //一条AT指令总超时时间计数 接像上面示例那样将AT指令填进去就可以,需要注意的是: 1.如果otime为0,则retryNum无意义。 2.如果otime和noAckOtime都为0,则没有超时处理。 3.type需要大于2,且每个指令对应一个...
  • 适用于发送和接收字符串都确定的模块,AT模块通用初始化模板。功能:发送完,自动检查回复指令内容,支持超时重发,模块重启等操作,以RM08模块为历程,可移植到类似的模块。
  • LiteOS学习笔记-4通信模组之AT框架一、AT客户端简介什么是AT客户端AT客户端框架作用二、串口驱动框架实现2.1串口初始化2.2读写缓冲区ring_...的使用AT框架使能及配置发送AT指令获取AT指令返回结果并提取有效信息...
  • AT指令的一种解析想法

    万次阅读 2018-10-11 14:52:32
    AT指令大家很熟悉了,这里不再做介绍(不熟悉的,请参考《GSM Rec.07.07标准AT命令》)。 一个命令类型最多分为四类: 1、设置类型,CMD=设置参数,回复OK或者ERROR; 可用通用模式解析 2、读取类型,CMD?读取参数...
  • 为了实现基于Linux的LTE(长期演进)上行网关中应用程序与LTE模块之间的控制接口,提出了一种基于AT指令的实现方法...实际应用表明,该框架能够实现网关的attach(网络附着)及短信服务等业务,达到了...
  • 在使用AT指令的时候,直接发送AT指令的一端称为客户端(AT Client),接收AT指令并返回响应的一端称为服务端(AT Server)。 ESP8266、M26、BC35-G这些通信模组都是接收我们发送的AT指令,所以称为AT命令...
  • 1:查找对应的字符串 char *p_data =null; //找到"+TEST_RXLORA" 这个首地址 p_data = strstr((const char *)re_data, "+TEST_RXLORA"); //查找十进制数值(int *)&lora_rssi[rssi_cnt]) if(sscanf(p_data, "+...
  • AT指令解析,at指令解析框架,C,C++源码
  • 在GSM模块、NBIOT模块、4G模块的C/C++编程当中,很多这样的模块已经做成了标准的AT指令集,难免涉及到字符串的操作,比如拆分,拼接成一个AT指令。  众所周知,AT指令我感觉太恶心,为啥要设计出格式如此复杂的...
  • AT框架移植完成

    千次阅读 2020-02-01 00:06:24
    在之前几篇文章都已经介绍完TencentOS tiny的AT框架,在移植到自己项目时主要是用freeRTOS系统自带的组件(信号量等)替换掉tencentOS tiny的组件。 FreeRTOS信号量,互斥锁均是通过队列实现的,下面介绍一下相关API...
  • STM32物联网实战教程(一)—ESP8266的AT指令集详解

    千次阅读 多人点赞 2020-07-31 23:39:43
      介绍各种网络通信协议之前我们必须保证硬件设备先连接到网络才行,联网的方式有很多种,比如通过网线联网、GPRS 联网...ESP8266 的特点的就是价格便宜、资料齐全,支持 SDK 开发和 AT 开发。其中 SDK 开发可以省.
  • AT指令通讯,很多人都用阻塞方式进行,很不利于产品开发,本人写了一套模板,称不上什么框架,是以非阻塞式的通讯方式进行,大大减轻CPU负担,稍作修改可以跟ESP8266等WIFI模块以及所有支持AT指令通讯的模块进行通讯...
  • AT指令中文说明 更多资源请访问http://www.59186618.com

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,842
精华内容 10,336
关键字:

at指令框架