一种AT命令通信解析模块

编程入门 行业动态 更新时间:2024-10-27 09:38:05

仓库地址:gitee./moluo-tech/AT-Command.git

基本接口说明:

at_send_singlline, 发送单行命令,正确响应OK,错误响应ERROR,超时3S

at_send_multiline, 多行命令,正确响应OK,错误响应ERROR,超时3S

at_do_cmd,支持自定义发送格式与接收匹配串

at_do_work,支持自定义发送与接收解析

/*AT管理器 ------------------------------------------------------------------*/
typedef struct at_obj{at_adapter_t            adap;at_env_t                env;                             /* 作业运行环境*/at_item_t               items[10];                       /* 最大容纳10个作业*/at_item_t               *cursor;                         /* 当前作业项*/struct list_head        ls_ready, ls_idle;               /* 就绪,空闲作业链*/unsigned int            timer;unsigned int            urc_timer;                       /* urc接收计时器*/at_return               ret; //urc接收计数, 命令响应接收计数器unsigned short          urc_t, recv_t;unsigned char           suspend: 1;
}at_obj_t; at_obj_t为一个AT解析器,adap:为一个AT适配器,主要用于发送数据给AT模块和接收来自AT模块的数据
env: 记录AT解析器运行相关状态和数据
cursor:当前作业项指针
ls_ready:待处理作业表项链表节点
ls_idle:空闲作业表链表节点
items为AT解析器作业表

其将一个AT解析器看作是一个at_obj_t。
 

/*AT接口适配器 ---------------------------------------------------------------*/
typedef struct {unsigned int (*write)(const void *buf, unsigned int len); /* 发送接口*/unsigned int (*read)(void *buf, unsigned int len);        /* 接收接口*/void         (*error)(void);                              /* AT执行异常事件*/utc_item_t    *utc_tbl;                                   /* urc 表*/unsigned char *urc_buf;                                   /* urc接收缓冲区*/unsigned char *recv_buf;                                  /* 数据缓冲区*/unsigned short urc_tbl_count;                             /* urc表项个数*/unsigned short urc_bufsize;                               /* urc缓冲区大小*/unsigned short recv_bufsize;                              /* 接收缓冲区大小*/
}at_adapter_t;at_adapter_t为一个AT适配器,write和read:用来发送和接收数据接口error:用来处理错误回调函数utc_tbl:utc表,其意义是收到AT模块发来的匹配项(prefix)后,执行相应的动作(handler)urc_buf:urc接收的缓存区recv_buf:适配器接收到数据缓存区,recv_buf和urc_buf数据都是适配器收到的数据urc_tbl_count:用来记录utc表大小
/*urc处理项 -----------------------------------------------------------------*/
typedef struct {const char *prefix;  //需要匹配的头部void (*handler)(char *recvbuf, int size); 
}utc_item_t;
/*AT作业运行环境*/
typedef struct {int         i,j,state;                                    void        *params;void        (*reset_timer)(struct at_obj *at); bool        (*is_timeout)(struct at_obj *at, unsigned int ms); /*时间跨度判断*/void        (*printf)(struct at_obj *at, const char *fmt, ...);char *      (*find)(struct at_obj *at, const char *expect);char *      (*recvbuf)(struct at_obj *at);                 /* 指向接收缓冲区*/unsigned int(*recvlen)(struct at_obj *at);                 /* 缓冲区总长度*/void        (*recvclr)(struct at_obj *at);                 /* 清空接收缓冲区*/bool        (*abort)(struct at_obj *at);                   /* 终止执行*/
}at_env_t;state:用来记录适配器工作状态:处于发送数据态、等待接收AT模块响应状态、等待接收AT模块超时状态见:do_cmd_handler、send_signlline_handler、send_multiline_handlerparams:不同的作业类型其含义不同#define AT_TYPE_WORK       0                             /* 普通作业 ----------*/
#define AT_TYPE_CMD        1                             /* 标准命令 ----------*/  
#define AT_TYPE_MULTILINE  2                             /* 多行命令 ----------*/
#define AT_TYPE_SINGLLINE  3                             /* 单行命令 ----------*/为AT_TYPE_WORK时,其指向at_obj_t为AT_TYPE_CMD时,其为NULL为AT_TYPE_MULTILINE时,其为多行命令字符串指针为AT_TYPE_SINGLLINE时,其为单行命令字符串指针at_env_t中的params数据追踪:函数add_work(at_obj_t *at, void *params, void *info, int type)的第二个参数params其赋给at_item_t中的param。函数at_work_manager中的e->params = at->cursor->param;语句就是将at_item_t中的param赋给at_env_t中的paramsreset_timer:当适配器发送完一个作业后会调用reset_timer来更新当前时刻,以便等待AT模块响应超时,见函数do_cmd_handler、send_signlline_handler、send_multiline_handleris_timeout:用于判断等待AT模块响应超时时间是否到达printf:用于调试过程中打印一些信息find:用于匹配收到来自AT模块响应字符串,此处没有间接调用find而是直接调用search_stringrecvbuf:用来获取适配器接收缓存见get_recv_buf函数recvlen:用来获取适配器接收缓存大小,见get_recv_count函数recvclr:清除适配器中的接收区缓存数据其实质就是将at_obj_t中的recv_t接收数据个数清0,见recv_buf_clear函数

作业项数据结构分析:

/*AT作业项*/
typedef struct {unsigned int  state : 3;unsigned int  type  : 3;                                 /* 作业类型*/unsigned int  abort : 1; void          *param;                                    /* 通用参数*/void          *info;                                     /* 通用信息指针*/struct list_head node;                                   /* 链表结点*/
}at_item_t;at_item_t用于记录一个作业一些信息和状态
state:/*AT状态 (当前版本未用) ------------------------------------------------------*/typedef enum {AT_STATE_IDLE,                                             /* 空闲状态*/AT_STATE_WAIT,                                             /* 等待执行*/AT_STATE_EXEC,                                             /* 正在执行*/}at_work_state;type:作业类型/**AT作业类型(实际是4种类型的状态机轮询程序) -----------------------------------*/#define AT_TYPE_WORK       0                             /* 普通作业 ----------*/#define AT_TYPE_CMD        1                             /* 标准命令 ----------*/  #define AT_TYPE_MULTILINE  2                             /* 多行命令 ----------*/#define AT_TYPE_SINGLLINE  3                             /* 单行命令 ----------*/param:AT_TYPE_WORK:at_obj_tAT_TYPE_CMD: NULLAT_TYPE_MULTILINE:指向多行命令字符串指针AT_TYPE_SINGLLINE:指向单行命令字符串指针
info:AT_TYPE_WORK:普通作业执行的实际工作函数AT_TYPE_CMD: 指向at_cmd_t,标准命令执行的工作AT_TYPE_MULTILINE:指向at_callbatk_t,多行命令执行完调用的回调函数AT_TYPE_SINGLLINE:指向at_callbatk_t,单行命令执行完调用的回调函数
node:当前作业对应的链表节点

 可以参考其仓库中有一个wifi_task.c例子

at_poll_task:AT解析器工作函数,调用at_work_manager用来处理链表中存在的作业表,当前有作业要处理时,会将当前数据发送给AT模块,再从AT适配器中读取数据,接收到数据分成两部分处理,一个是调用urc_recv_process来搜索urc表匹配的字符串,匹配上进行相应的处理,一般用来打印调试信息,用以记录AT模块工作过程和状态,另一个是在函数at_work_manager中根据作业类型调用do_work_handler、do_cmd_handler、send_signlline_handler、send_multiline_handler来根据实际收到AT模块收到的数据做不同处理。其处理是根据作业类型来决定。如下

AT_TYPE_WORK:直接调用int (*work)(at_env_t *e),其完成的工作主要是一些不与AT模块交互的工作,因此AT_TYPE_WORK作业不用发送数据给AT模块也不必理会来自AT模块的数据

AT_TYPE_CMD:自定义发送器sender,发送完后根据每一个at_cmd_t收到匹配项matcher项作相应的处理(调用cb),AT_TYPE_CMD作业是最灵活的每一个at_cmd_t对应不同的处理

typedef struct {
    void (*sender)(at_env_t *e);                            /*自定义发送器 */
    const char *matcher;                                    /*接收匹配串 */
    at_callbatk_t  cb;                                      /*响应处理 */
    unsigned char  retry;                                   /*错误重试次数 */
    unsigned short timeout;                                 /*最大超时时间 */
}at_cmd_t;

AT_TYPE_SINGLLINE,AT_TYPE_MULTILINE:只针对AT模块回应是"OK"和"ERROR"的命令

更多推荐

模块,命令,通信

本文发布于:2023-05-20 23:55:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/156761.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模块   命令   通信

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!