#include "at.h"
/* AT指令表 */
const AT_cmd_func at_cmd_func[] = {
{AT_CMD_TEST, "AT", at_cmd_test},
{AT_CMD_NAME, "AT+NAME=", at_cmd_name},
{AT_CMD_DISA, "AT+DISC", NULL},
{AT_CMD_TX_POWER, "AT+TX=", NULL},
{AT_CMD_ADV_INTERVAL, "AT+ADV_INTERVAL=", NULL},
{AT_CMD_CON_INTERVAL, "AT+CON_INTERVAL=", NULL},
{AT_CMD_ADV_ONOFF, "AT_ADV=", NULL},
{AT_GET_VER, "AT+VERSION=", NULL},
{AT_GET_CON_STATE, "AT+STATE", NULL},
{AT_CMD_UART_CFG, "AT+UART_CFG=", NULL},
{AT_END, NULL, NULL}
};
unsigned int mstrlen(const char* s) {
const char* ss = s;
while (*ss)
ss++;
return ss - s;
}
int mstrncmp(const char* s1, const char* s2, int n) {
const unsigned char* c1 = (const unsigned char*)s1;
const unsigned char* c2 = (const unsigned char*)s2;
unsigned char ch;
int d = 0;
while (n--) {
d = (int)(ch = *c1++) - (int)*c2++;
if (d || !ch)
break;
}
return d;
}
/* 指令执行函数 */
unsigned char at_cmd_test(unsigned char* p, unsigned char len) {
AT_DEBUG_INFO("AT+OK\r\n");
return 0;
}
unsigned char at_cmd_name(unsigned char* p, unsigned char len) {
if (*p == '?') {
AT_DEBUG_INFO("AT+OK BLE-NAME\r\n");
}
else {
AT_DEBUG_INFO("AT+OK\r\n");
}
return 0;
}
/* 查找指令表中对应的指令 */
unsigned char AT_cmd_search(unsigned char* p, unsigned char len) {
unsigned char ret = 0;
//unsigned char* pstr;
unsigned char i, n;
for (i = 1; at_cmd_func[i].cmd != AT_END; i++) {
n = mstrlen(at_cmd_func[i].str);
if (!mstrncmp(p, at_cmd_func[i].str, n)) {
ret = i;
break;
}
}
return ret;
}
/* AT指令解析 */
unsigned char at_cmd_parse(unsigned char* p, unsigned char len) {
unsigned char ret = AT_SUCCESS;
unsigned char index = 0;
if (len < 4) return AT_ERR; /* 不符合指令最小长度 */
if ((p[0] == 'A') && (p[1] == 'T') && (p[len - 2] == 0x0D) && (p[len - 1] == 0x0A)) {
if (len == 4) { /* 测试指令 */
if (at_cmd_func[AT_CMD_TEST].cb != NULL)
at_cmd_func[AT_CMD_TEST].cb(NULL, 0); /* 执行测试指令 */
}
else if (p[2] == '+') { /* 执行指令解析 */
index = AT_cmd_search(p, len); /* 查找匹配的执行指令,0-已匹配,!0-未匹配 */
if (index) {
if (at_cmd_func[index].cb != NULL) { /* 判断指令对应执行函数是否存在 */
unsigned char n;
n = mstrlen(at_cmd_func[index].str);
ret = at_cmd_func[index].cb(p + n, len - n); /* 执行对应的指令函数, p+n:将指令参数传输执行函数,len-n-2:指令参数有效长度 */
}
else
ret = AT_ERR_FUN_UNUSED; /* 没有可执行函数 */
}
else {
ret = AT_ERR_UNINVAIL; /* 未找到匹配的指令 */
}
}
}
else {/* 格式不匹配 */
return AT_ERR;
}
return ret;
}
/* 测试 */
int main(void) {
unsigned char ret;
unsigned char i, n, m;
#define CMD_NUM_MAX 5
char* test_cmd[CMD_NUM_MAX] = {
"AT\r\n",
"AT+NAME=BLE-TEST\r\n",
"AT+NAME=?\r\n",
"AT+DISC\r\n",
"AT+NBME=?\r\n",
};
for (i = 0; i < CMD_NUM_MAX; i++) {
m = mstrlen(test_cmd[i]);
AT_DEBUG_INFO("AT指令:%s\r\n", test_cmd[i]);
ret = at_cmd_parse(test_cmd[i], m);
if (ret)
AT_DEBUG_INFO("AT ERR! = %d\r\n", ret);
}
return 0;
}
一个AT指令解析框架,mark一下
需积分: 0 115 浏览量
2023-08-27
16:40:58
上传
评论 2
收藏 2KB ZIP 举报
zlx20008
- 粉丝: 0
- 资源: 1
最新资源
- 5G网络基础培训课件.zip
- 2024-spring-HIT-CS-大作业
- yolo目标检测项目实验
- downloadFile-1.hc
- C++课程设计:基于Qt的航班信息管理系统
- ADS7822UVerilog驱动,前面传的有点问题
- 基于python的高性能爬虫程序,使用了多线程+缓存+xpath实现的,这里以彼-岸图库为例,实现,仅用于学习交流
- 中分辨率成像光谱仪(MODIS)烧毁面积产品信息MODIS-C6-BA-User-Guide-1.2.pdf
- Screenshot_20240427_172613_com.huawei.browser.jpg
- 关于学习Python的相关资源网站链接及相关介绍.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈