AT 指令解析器

概述

AT指令解析器主要用于发送命令、等待响应,用户可通过atparser_response_recv()获取并解析该应答数据,对于对端主动发送的数据(数据即为带外数据),则传入对应的带外处理函数中

接口定义

初始化一个AT指令解析器

atparser_uservice_t *atparser_init(utask_t *task, const char *name, uart_config_t *config)

根据指定的微服务任务,串口名以及串口配置信息创建一个AT 指令解析器,成功则返回atparser_uservice_t指针,失败返回NULL

  • 参数:
    • task:微服务任务
    • name: 串口名
    • config: 串口配置信息
  • 返回值:
    • 成功则返回atparser_uservice_t指针,失败返回NULL

初始化一个指定数据传输通道的AT指令解析器

atparser_uservice_t *atparser_channel_init(utask_t *task, const char *name, void *config, at_channel_t *channel);

根据指定的微服务任务,指定的数据传输的通道、通道名以及通道配置信息创建一个AT 指令解析器,成功则返回atparser_uservice_t指针,失败返回NULL

  • 参数:
    • task:微服务任务
    • name: 通道名
    • config: 通道配置信息
    • channel:指定的数据传输的通道
  • 返回值:
    • 成功则返回atparser_uservice_t指针,失败返回NULL

带外数据处理函数的格式

typedef int (*oob_callback)(atparser_uservice_t *at, void *pive, oob_data_t *oob_data);

用户根据传入的数据,做相关的处理,若处理完成则返回0;若处理未完成则返回-1

  • 参数:
    • at: AT 指令解析器
    • pive:用户自定义数据
    • oob_data: 带外数据结构体
  • 返回值:
    • 0表示处理完成并退出本次OOB,-1表示处理未完成,需要继续执行OOB

创建一个带外数据服务

int atparser_oob_create(atparser_uservice_t *at, const char *prefix, oob_callback cb, void *context);

根据指定的AT 指令解析器,带外数据匹配字符串,带外数据处理函数,以及用户自定义的上下文创建一个带外数据处理服务,成功则返回0,失败则返回负值

  • 参数:
    • at: AT 指令解析器
    • prefix:带外数据匹配字符串
    • cb: 带外数据处理函数
    • context: 服务自定义上下文,用户在带外数据处理函数时,可使用该上下文
  • 返回值:
    • 成功则返回0,失败返回负值,错误号如下:
      • -ENOMEM 内存不足
      • -EINVAL 无效的参数

删除一个带外数据服务

int atparser_oob_delete(atparser_uservice_t *at, const char *prefix);

根据指定的AT 指令解析器,带外数据匹配字符串,删除对应带外数据处理函数并释放相关资源,成功则返回0,失败负值

  • 参数:
    • at: AT 指令解析器
    • prefix:带外数据匹配字符串
  • 返回值:
    • 成功则返回0,失败返回负值,错误号如下:
      • -EINVAL 无效的参数

设置结束字符串

void atparser_set_terminator(atparser_uservice_t *at, const char *terminator);

根据指定的AT 指令解析器,结束字符串,设置对应AT解析器的结束字符串

  • 参数:
    • at: AT 指令解析器
    • terminator:待设置的结束字符串
  • 返回值:
    • 无返回值

设置超时时间

void atparser_set_timeout(atparser_uservice_t *at, int timeout);

根据指定的AT 指令解析器,超时时间(单位:ms),设置对应AT解析器的超时时间

  • 参数:
    • at: AT 指令解析器
    • timeout:待设置的超时时间
  • 返回值:
    • 无返回值

格式化输出字符串

int atparser_send(atparser_uservice_t *at, const char *format, ...);

根据指定的AT 指令解析器,格式化字符串以及输出列表,发送对应的字符串,成功则返回0,失败则返回负值,用法参照printf();

  • 参数:
    • at: AT 指令解析器
    • format:格式化字符串
    • ...:输出列表
  • 返回值:
    • 成功则返回0,失败返回负值,错误码如下:
      • -EINVAL 无效的参数

接收并解析一行数据

int atparser_recv(atparser_uservice_t *at, const char *response, ...);

根据指定的AT 指令解析器,格式化的字符串以及输出列表,接收并解析一行数据,成功则返回0,失败负值,用法参照sscanf();

  • 参数:
    • at: AT 指令解析器
    • response:格式化字符串
    • ...:输出列表
  • 返回值:
    • 成功则返回0,失败返回负值,错误码如下:
      • -EINVAL 无效的参数

清除缓存行数据

void atparser_clr_buf(atparser_uservice_t *at);

根据指定的AT 指令解析器,清除已接收的行数据;

  • 参数:

    • at: AT 指令解析器
  • 返回值:

    • 无返回值

发送退出

void atparser_cmd_exit(atparser_uservice_t *at);

根据指定的AT 指令解析器,在发送格式化字符串后退出,与atparser_send()配合使用;

  • 参数:

    • at: AT 指令解析器
  • 返回值:

    • 无返回值

发送数据

int atparser_write(atparser_uservice_t *at, const void *data, int size);

根据指定的AT 指令解析器,数据长度,发送对应的数据;

  • 参数:
    • at: AT 指令解析器
    • data:数据头指针
    • size:数据大小
  • 返回值:
    • 成功则返回0,失败返回-1

log控制开关

void atparser_debug_control(atparser_uservice_t *at,int flag);

控制指定的AT 指令解析器log开关;

  • 参数:
    • at: AT 指令解析器
    • flag:0:关闭log;1:打开log
  • 返回值:
    • 无返回值

接收并解析一行数据

int atparser_recv_str(atparser_uservice_t *at, const char *str);

根据指定的AT 指令解析器,接收并解析一行数据,成功则返回0,失败负值

  • 参数:
    • at:AT 指令解析器
    • str:接收的字符串
  • 返回值:
    • 成功则返回0,失败返回负值,错误码如下:
      • -EINVAL 无效的参数

示例代码

static atparser_uservice_t *g_atparser_uservice_t;

int esp8266_close(int id)
{/*
        AT协议为 --->"AT+CIPCLOSE=0\r\n"
                <---"OK\r\n"
 */
    int ret = -1;

    atparser_clr_buf(g_atparser_uservice_t);  //清除之前的缓存数据

    if (atparser_send(g_atparser_uservice_t, "AT+CIPCLOSE=%d", id) == 0) { //发送数据“AT+CIPCLOSE=0”
        if (atparser_recv(g_atparser_uservice_t, "OK") == 0) { // 接收数据“OK”
            ret = 0;
        }
    }

    atparser_cmd_exit(g_atparser_uservice_t); // 退出本次接收

    return ret;
}

static int _gotip_handler(atparser_uservice_t *at, void *priv, oob_data_t *oob_data)
{//接收到“WIFI GOT IP” oob的处理
    LOGD(TAG, "got ip\n");

        ......

    return 0;
}

int esp8266_module_init(void)
{
    uart_config_t config;
    utask_t *task = utask_new("esp8266", 1 * 1024, QUEUE_MSG_COUNT, AOS_DEFAULT_APP_PRI + 4);  //创建atparser 所需的utask

    if (task == NULL) {
        return -1;
    }

    uart_config_default(&config);  // 初始化uart参数
    config.baud_rate = 115200;     // uart baud为115200

    g_atparser_uservice_t = atparser_init(task, “uart0”, &config); //初始化atparser 微服务

    atparser_oob_create(g_atparser_uservice_t, "WIFI GOT IP", _gotip_handler, NULL);  //注册“WIFI GOT IP”的oob,回掉函数为“_gotip_handler”

    return 0;
}

results matching ""

    No results matching ""