#include "atcmd.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) { printf("AT+OK\r\n"); return 0; } unsigned char at_cmd_name(unsigned char *p, unsigned char len) { if (*p == '?') { printf("AT+OK BLE-NAME\r\n"); } else { printf("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((const char *)at_cmd_func[i].str); if (!mstrncmp((const char *)p, (const char *)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((const char *)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; }