You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

138 lines
3.2 KiB

#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;
}