產(chǎn)品很多配置信息需要后期進(jìn)行配置,配置交互最好的方式之一是上位機(jī)通過(guò)串口與開發(fā)板進(jìn)行交互來(lái)完配置。這里我準(zhǔn)備引入AT指令來(lái)進(jìn)行配置。
我采用串口中斷+定時(shí)器中斷來(lái)實(shí)現(xiàn)了串口的接收,下面進(jìn)行AT指令框架的創(chuàng)建。
- 首先定義了指令結(jié)構(gòu):
typedef enum{
AT_CMD_TEST = 0,
AT_CMD_SETRTC,
AT_END
}AT_Cmd;
typedef unsigned char (*pFunc)(unsigned char *ptr, unsigned char len);
typedef struct
{
AT_Cmd cmd; /* 指令序號(hào) */
unsigned char *str; /* 指令內(nèi)容 */
pFunc cb; /* 指令執(zhí)行 */
}AT_cmd_func;
/* AT指令表 */
const AT_cmd_func at_cmd_func[] = {
{AT_CMD_TEST, "AT", at_cmd_test},
{AT_CMD_SETRTC, "AT+SETRTC=", at_cmd_setrtc},
{AT_END, NULL, NULL}
};
- 我定義了執(zhí)行指令的函數(shù)1個(gè)是AT測(cè)試,再有一條是設(shè)置RTC的指令(具體還沒有實(shí)現(xiàn),只是定義了一條打印指令);
/* 指令執(zhí)行函數(shù) */
unsigned char at_cmd_test(unsigned char *p, unsigned char len){
AT_DEBUG_INFO("AT+OKrn");
return 0;
}
unsigned char at_cmd_setrtc(unsigned char *p, unsigned char len){
AT_DEBUG_INFO("setrtcrn");
return 0;
}
- 最后我們進(jìn)行指令解析,主要有兩個(gè)函數(shù),一個(gè)是檢索指令表里是否存在指令,二個(gè)是解析指令,如果成果測(cè)執(zhí)行相應(yīng)的指令。
/* 查找指令表中對(duì)應(yīng)的指令 */
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;
unsigned char n;
if(len < 4) {
return AT_ERR;
}
if((p[0] == 'A') && (p[1] == 'T') && (p[len-2] == 0x0D) && (p[len-1] == 0x0A)) {
if(len == 4) { /* 測(cè)試指令 */
if(at_cmd_func[AT_CMD_TEST].cb != NULL) {
at_cmd_func[AT_CMD_TEST].cb(NULL, 0); /* 執(zhí)行測(cè)試指令 */
}
}else if(p[2] == '+') { /* 執(zhí)行指令解析 */
index = AT_cmd_search(p, len); /* 查找匹配的執(zhí)行指令, 0-已匹配, !0-未匹配*/
if(index) {
if(at_cmd_func[index].cb != NULL) {
n = mstrlen(at_cmd_func[index].str);
ret = at_cmd_func[index].cb(p+n, len-n); /* 執(zhí)行對(duì)應(yīng)的指令函數(shù), p+n:將指令參數(shù)傳輸執(zhí)行函數(shù),len-n-2:指令參數(shù)有效長(zhǎng)度 */
}else {
ret = AT_ERR_FUN_UNUSED; /* 沒有可執(zhí)行函數(shù) */
}
}else {
ret = AT_ERR_UNINVAL; /* 未找到匹配的指令 */
}
}else { /* 格式不匹配 */
return AT_ERR;
}
return ret;
}
}
【測(cè)試】
我在接收到指令后執(zhí)行at_cmd_parse 發(fā)送AT、AT+SETRTC=成功的返回需要的信息。
審核編輯:湯梓紅
-
指令
+關(guān)注
關(guān)注
1文章
607瀏覽量
35692 -
串口
+關(guān)注
關(guān)注
14文章
1551瀏覽量
76421 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5032瀏覽量
97371 -
上位機(jī)
+關(guān)注
關(guān)注
27文章
941瀏覽量
54790 -
CW32
+關(guān)注
關(guān)注
1文章
203瀏覽量
626
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論