mirror of
https://gitee.com/moluo-tech/AT-Command.git
synced 2025-01-29 17:22:57 +08:00
优化URC匹配逻辑,并修正描述信息。
This commit is contained in:
parent
463baf0f5c
commit
76d13e373b
87
at.c
87
at.c
@ -14,6 +14,7 @@
|
||||
* 2.ɾ<EFBFBD><EFBFBD> at_obj_destroy<EFBFBD>ӿ<EFBFBD>
|
||||
* 2021-03-21 Morro ɾ<EFBFBD><EFBFBD>at_obj<EFBFBD>е<EFBFBD>at_work_ctx_t<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ʹ<EFBFBD><EFBFBD>
|
||||
* 2021-04-08 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* 2021-05-15 Morro <EFBFBD>Ż<EFBFBD>URCƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "at.h"
|
||||
@ -122,7 +123,7 @@ void at_obj_init(at_obj_t *at, const at_adapter_t *adap)
|
||||
|
||||
at->cmd_lock = ril_sem_new(1);
|
||||
at->completed = ril_sem_new(0);
|
||||
|
||||
at->urc_item = NULL;
|
||||
if (at->adap.debug == NULL)
|
||||
at->adap.debug = nop_dbg;
|
||||
|
||||
@ -216,40 +217,34 @@ int at_split_respond_lines(char *recvbuf, char *lines[], int count, char separat
|
||||
}
|
||||
return i;
|
||||
}
|
||||
/**
|
||||
* @brief <EFBFBD><EFBFBD>URC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>ѯURC<EFBFBD><EFBFBD>
|
||||
* @param[in] urcline - URC<EFBFBD><EFBFBD>
|
||||
* @return true - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, false - δʶ<EFBFBD><EFBFBD>URC
|
||||
*/
|
||||
const urc_item_t *find_urc_item(at_obj_t *at, char *urc_buf, unsigned int size)
|
||||
{
|
||||
const urc_item_t *tbl = at->adap.utc_tbl;
|
||||
int i;
|
||||
if (size < 2)
|
||||
return NULL;
|
||||
for (i = 0; i < at->adap.urc_tbl_count; i++) {
|
||||
if (strstr(urc_buf, tbl->prefix))
|
||||
return tbl;
|
||||
tbl++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief urc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* @param[in] urcline - URC<EFBFBD><EFBFBD>
|
||||
* @return true - <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>, false - δʶ<EFBFBD><EFBFBD>URC
|
||||
*/
|
||||
static bool urc_handler_entry(at_obj_t *at, char *urcline, unsigned int size)
|
||||
static void urc_handler_entry(at_obj_t *at, char *urcline, unsigned int size)
|
||||
{
|
||||
int i;
|
||||
int ch = urcline[size - 1];
|
||||
at_urc_ctx_t context = {at->adap.read, urcline, at->adap.urc_bufsize, size};
|
||||
|
||||
const utc_item_t *tbl = at->adap.utc_tbl;
|
||||
|
||||
if (tbl == NULL)
|
||||
return true;
|
||||
|
||||
for (i = 0; i < at->adap.urc_tbl_count; i++) {
|
||||
if (strstr(urcline, tbl->prefix)) { /* ƥ<><C6A5>ǰ*/
|
||||
|
||||
if (tbl->end_mark) { /* ƥ<><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
if (!strchr(tbl->end_mark, ch))
|
||||
return false;
|
||||
} else if (!(ch == '\r' || ch == '\n'|| ch == '\0'))
|
||||
return false;
|
||||
|
||||
at->adap.debug("<=\r\n%s\r\n", urcline);
|
||||
|
||||
tbl->handler(&context); /* <20>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ϲ㴦<CFB2><E3B4A6> */
|
||||
return true;
|
||||
}
|
||||
tbl++;
|
||||
}
|
||||
return false;
|
||||
at->adap.debug("<=\r\n%s\r\n", urcline);
|
||||
at->urc_item->handler(&context); /* <20>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ϲ㴦<CFB2><E3B4A6> */
|
||||
}
|
||||
|
||||
/**
|
||||
@ -266,30 +261,36 @@ static void urc_recv_process(at_obj_t *at, const char *buf, unsigned int size)
|
||||
//<2F><><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>,Ĭ<><C4AC>MAX_URC_RECV_TIMEOUT
|
||||
if (at->urc_cnt > 0 && at_istimeout(at->urc_timer, MAX_URC_RECV_TIMEOUT)) {
|
||||
urc_buf[at->urc_cnt] = '\0';
|
||||
at->urc_cnt = 0;
|
||||
at->urc_cnt = 0;
|
||||
at->urc_item = NULL;
|
||||
if (at->urc_cnt > 2)
|
||||
at->adap.debug("urc recv timeout=>%s\r\n", urc_buf);
|
||||
}
|
||||
|
||||
}
|
||||
while (size--) {
|
||||
at->urc_timer = at_get_ms();
|
||||
ch = *buf++;
|
||||
urc_buf[at->urc_cnt++] = ch;
|
||||
|
||||
if (strchr(SPEC_URC_END_MARKS, ch) || ch == '\0') { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
urc_buf[at->urc_cnt] = '\0';
|
||||
|
||||
if (ch == '\r' || ch == '\n'|| ch == '\0') { //<2F><><EFBFBD>1<E2B5BD><31>URC
|
||||
if (at->urc_cnt > 2) {
|
||||
if (!urc_handler_entry(at, urc_buf, at->urc_cnt) && !at->busy)
|
||||
at->adap.debug("%s\r\n", urc_buf); //δʶ<CEB4><EFBFBD>URC
|
||||
if (strchr(SPEC_URC_END_MARKS, ch) || ch == '\0') { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
urc_buf[at->urc_cnt] = '\0';
|
||||
if (at->urc_item == NULL)
|
||||
at->urc_item = find_urc_item(at, urc_buf, at->urc_cnt);
|
||||
if (at->urc_item != NULL){
|
||||
if (strchr(at->urc_item->end_mark, ch)) { //ƥ<><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
urc_handler_entry(at, urc_buf, at->urc_cnt);
|
||||
at->urc_cnt = 0;
|
||||
at->urc_item = NULL;
|
||||
}
|
||||
at->urc_cnt = 0;
|
||||
} else if (urc_handler_entry(at, urc_buf, at->urc_cnt)) {
|
||||
at->urc_cnt = 0;
|
||||
} else if (ch == '\r' || ch == '\n'|| ch == '\0') {
|
||||
if (at->urc_cnt > 2 && !at->busy) {
|
||||
at->adap.debug("%s\r\n", urc_buf); //δʶ<CEB4><EFBFBD>URC
|
||||
}
|
||||
at->urc_cnt = 0;
|
||||
}
|
||||
} else if (at->urc_cnt >= at->adap.urc_bufsize) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
at->urc_cnt = 0;
|
||||
} else if (at->urc_cnt >= at->adap.urc_bufsize) { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
at->urc_cnt = 0;
|
||||
at->urc_item = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
10
at.h
10
at.h
@ -13,6 +13,7 @@
|
||||
* 2.ɾ<EFBFBD><EFBFBD> at_obj_destroy<EFBFBD>ӿ<EFBFBD>
|
||||
* 2021-03-21 Morro ɾ<EFBFBD><EFBFBD>at_obj<EFBFBD>е<EFBFBD>at_work_ctx_t<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>ʹ<EFBFBD><EFBFBD>
|
||||
* 2021-04-08 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD>ͷ<EFBFBD><EFBFBD>ź<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
* 2021-05-15 Morro <EFBFBD>Ż<EFBFBD>URCƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef _AT_H_
|
||||
@ -28,7 +29,7 @@
|
||||
#define MAX_URC_RECV_TIMEOUT 300
|
||||
|
||||
/* ָ<><D6B8><EFBFBD><EFBFBD>URC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> */
|
||||
#define SPEC_URC_END_MARKS ",\r\n"
|
||||
#define SPEC_URC_END_MARKS ":,\r\n"
|
||||
|
||||
struct at_obj; /* AT<41><54><EFBFBD><EFBFBD>*/
|
||||
|
||||
@ -71,7 +72,7 @@ typedef struct {
|
||||
* @params ctx - URC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
*/
|
||||
void (*handler)(at_urc_ctx_t *ctx);
|
||||
}utc_item_t;
|
||||
}urc_item_t;
|
||||
|
||||
/**AT<41>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------------------------------------------*/
|
||||
typedef struct {
|
||||
@ -82,7 +83,7 @@ typedef struct {
|
||||
//<2F><><EFBFBD>Դ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
|
||||
void (*debug)(const char *fmt, ...);
|
||||
//utc <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
|
||||
utc_item_t *utc_tbl;
|
||||
urc_item_t *utc_tbl;
|
||||
//urc<72><63><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
|
||||
char *urc_buf;
|
||||
//urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>0
|
||||
@ -133,10 +134,11 @@ typedef struct at_obj {
|
||||
at_sem_t cmd_lock; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
at_sem_t completed; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>*/
|
||||
at_respond_t *resp; /* ATӦ<54><D3A6><EFBFBD><EFBFBD>Ϣ*/
|
||||
const urc_item_t *urc_item; /* <20><>ǰURC<52><43>*/
|
||||
unsigned int resp_timer; /* <20><>Ӧ<EFBFBD><D3A6><EFBFBD>ն<EFBFBD>ʱ<EFBFBD><CAB1>*/
|
||||
unsigned int urc_timer; /* URC<52><43>ʱ<EFBFBD><CAB1> */
|
||||
at_return ret; /* <20><><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>*/
|
||||
unsigned short urc_cnt, rcv_cnt;
|
||||
unsigned short urc_cnt, rcv_cnt; /* <20><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>*/
|
||||
unsigned char busy : 1;
|
||||
unsigned char suspend: 1;
|
||||
unsigned char dowork : 1;
|
||||
|
Loading…
x
Reference in New Issue
Block a user