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 无效的参数
- 成功则返回0,失败返回负值,错误号如下:
删除一个带外数据服务
int atparser_oob_delete(atparser_uservice_t *at, const char *prefix);
根据指定的AT 指令解析器,带外数据匹配字符串,删除对应带外数据处理函数并释放相关资源,成功则返回0,失败负值
- 参数:
- at: AT 指令解析器
- prefix:带外数据匹配字符串
- 返回值:
- 成功则返回0,失败返回负值,错误号如下:
- -EINVAL 无效的参数
- 成功则返回0,失败返回负值,错误号如下:
设置结束字符串
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 无效的参数
- 成功则返回0,失败返回负值,错误码如下:
接收并解析一行数据
int atparser_recv(atparser_uservice_t *at, const char *response, ...);
根据指定的AT 指令解析器,格式化的字符串以及输出列表,接收并解析一行数据,成功则返回0,失败负值,用法参照sscanf();
- 参数:
- at: AT 指令解析器
- response:格式化字符串
- ...:输出列表
- 返回值:
- 成功则返回0,失败返回负值,错误码如下:
- -EINVAL 无效的参数
- 成功则返回0,失败返回负值,错误码如下:
清除缓存行数据
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 无效的参数
- 成功则返回0,失败返回负值,错误码如下:
示例代码
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;
}