#include "at_bluetooth.h" #define MEM_CACHE_LEN (64U) unsigned char bluetooth_state = 0; static unsigned char at_memcmp_cache[MEM_CACHE_LEN]; static unsigned char at_cmd_test(unsigned char *p, unsigned char len); static unsigned char at_cmd_name(unsigned char *p, unsigned char len); #if BLE_TYPE == BLE_TYPE_HC42 /* AT指令表 */ const at_cmd_func_t at_cmd_func[] = { {AT_CMD_TEST, "AT", at_cmd_test}, {AT_CMD_NAME_REQ, "AT+NAME", at_cmd_name}, {AT_CMD_NAME, "AT+NAME=", at_cmd_name}, {AT_END, NULL, NULL}}; const char split_c = '='; #elif BLE_TYPE == BLE_TYPE_MX02 /* AT指令表 */ const at_cmd_func_t at_cmd_func[] = { {AT_CMD_TEST, "AT", at_cmd_test}, // 这个指令没用,为了和HC42统一 {AT_GET_VER, "AT+VER", at_cmd_test}, {AT_CMD_NAME_REQ, "AT+NAME", at_cmd_name}, {AT_CMD_NAME, "AT+NAME=", at_cmd_name}, {AT_END, NULL, NULL}}; const char split_c = ':'; #endif void at_set_memcmp_cache(unsigned char *p, unsigned char len) { osel_memset(at_memcmp_cache, 0, MEM_CACHE_LEN); osel_memcpy(at_memcmp_cache, p, len); } /* 指令执行函数 */ static unsigned char at_cmd_test(unsigned char *p, unsigned char len) { BIT_SET(bluetooth_state, BIT0); return 0; } static unsigned char at_cmd_name(unsigned char *p, unsigned char len) { if (*p == split_c) { p++; // 偏移一个字节split_c if (osel_memcmp(p, at_memcmp_cache, osel_mstrlen(at_memcmp_cache)) == 0) // 去掉最后\r\n { BIT_SET(bluetooth_state, BIT1); } } 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 = osel_mstrlen((unsigned char *)at_cmd_func[i].str); if (!osel_memcmp(p, (unsigned 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 < 2) return AT_ERR; /* 不符合指令最小长度 */ if ((p[0] == 'A') && (p[1] == 'T')) { if (len == 2) { /* 测试指令 */ 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 = osel_mstrlen((unsigned 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; }