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>
|
* 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-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-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"
|
#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->cmd_lock = ril_sem_new(1);
|
||||||
at->completed = ril_sem_new(0);
|
at->completed = ril_sem_new(0);
|
||||||
|
at->urc_item = NULL;
|
||||||
if (at->adap.debug == NULL)
|
if (at->adap.debug == NULL)
|
||||||
at->adap.debug = nop_dbg;
|
at->adap.debug = nop_dbg;
|
||||||
|
|
||||||
@ -216,40 +217,34 @@ int at_split_respond_lines(char *recvbuf, char *lines[], int count, char separat
|
|||||||
}
|
}
|
||||||
return i;
|
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>
|
* @brief urc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
* @param[in] urcline - URC<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};
|
at_urc_ctx_t context = {at->adap.read, urcline, at->adap.urc_bufsize, size};
|
||||||
|
at->adap.debug("<=\r\n%s\r\n", urcline);
|
||||||
const utc_item_t *tbl = at->adap.utc_tbl;
|
at->urc_item->handler(&context); /* <20>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD>ϲ㴦<CFB2><E3B4A6> */
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -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
|
//<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)) {
|
if (at->urc_cnt > 0 && at_istimeout(at->urc_timer, MAX_URC_RECV_TIMEOUT)) {
|
||||||
urc_buf[at->urc_cnt] = '\0';
|
urc_buf[at->urc_cnt] = '\0';
|
||||||
at->urc_cnt = 0;
|
at->urc_cnt = 0;
|
||||||
|
at->urc_item = NULL;
|
||||||
if (at->urc_cnt > 2)
|
if (at->urc_cnt > 2)
|
||||||
at->adap.debug("urc recv timeout=>%s\r\n", urc_buf);
|
at->adap.debug("urc recv timeout=>%s\r\n", urc_buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (size--) {
|
while (size--) {
|
||||||
at->urc_timer = at_get_ms();
|
at->urc_timer = at_get_ms();
|
||||||
ch = *buf++;
|
ch = *buf++;
|
||||||
urc_buf[at->urc_cnt++] = ch;
|
urc_buf[at->urc_cnt++] = ch;
|
||||||
|
|
||||||
if (strchr(SPEC_URC_END_MARKS, ch) || ch == '\0') { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
if (strchr(SPEC_URC_END_MARKS, ch) || ch == '\0') { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
||||||
urc_buf[at->urc_cnt] = '\0';
|
urc_buf[at->urc_cnt] = '\0';
|
||||||
|
if (at->urc_item == NULL)
|
||||||
if (ch == '\r' || ch == '\n'|| ch == '\0') { //<2F><><EFBFBD>1<E2B5BD><31>URC
|
at->urc_item = find_urc_item(at, urc_buf, at->urc_cnt);
|
||||||
if (at->urc_cnt > 2) {
|
if (at->urc_item != NULL){
|
||||||
if (!urc_handler_entry(at, urc_buf, at->urc_cnt) && !at->busy)
|
if (strchr(at->urc_item->end_mark, ch)) { //ƥ<><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
at->adap.debug("%s\r\n", urc_buf); //δʶ<CEB4><EFBFBD>URC
|
urc_handler_entry(at, urc_buf, at->urc_cnt);
|
||||||
|
at->urc_cnt = 0;
|
||||||
|
at->urc_item = NULL;
|
||||||
}
|
}
|
||||||
at->urc_cnt = 0;
|
} else if (ch == '\r' || ch == '\n'|| ch == '\0') {
|
||||||
} else if (urc_handler_entry(at, urc_buf, at->urc_cnt)) {
|
if (at->urc_cnt > 2 && !at->busy) {
|
||||||
at->urc_cnt = 0;
|
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>
|
} else if (at->urc_cnt >= at->adap.urc_bufsize) { //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
at->urc_cnt = 0;
|
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>
|
* 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-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-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_
|
#ifndef _AT_H_
|
||||||
@ -28,7 +29,7 @@
|
|||||||
#define MAX_URC_RECV_TIMEOUT 300
|
#define MAX_URC_RECV_TIMEOUT 300
|
||||||
|
|
||||||
/* ָ<><D6B8><EFBFBD><EFBFBD>URC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> */
|
/* ָ<><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>*/
|
struct at_obj; /* AT<41><54><EFBFBD><EFBFBD>*/
|
||||||
|
|
||||||
@ -71,7 +72,7 @@ typedef struct {
|
|||||||
* @params ctx - URC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
* @params ctx - URC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
void (*handler)(at_urc_ctx_t *ctx);
|
void (*handler)(at_urc_ctx_t *ctx);
|
||||||
}utc_item_t;
|
}urc_item_t;
|
||||||
|
|
||||||
/**AT<41>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------------------------------------------*/
|
/**AT<41>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------------------------------------------*/
|
||||||
typedef struct {
|
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
|
//<2F><><EFBFBD>Դ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
|
||||||
void (*debug)(const char *fmt, ...);
|
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 <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
|
//urc<72><63><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
|
||||||
char *urc_buf;
|
char *urc_buf;
|
||||||
//urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>0
|
//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 cmd_lock; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||||
at_sem_t completed; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><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>Ϣ*/
|
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 resp_timer; /* <20><>Ӧ<EFBFBD><D3A6><EFBFBD>ն<EFBFBD>ʱ<EFBFBD><CAB1>*/
|
||||||
unsigned int urc_timer; /* URC<52><43>ʱ<EFBFBD><CAB1> */
|
unsigned int urc_timer; /* URC<52><43>ʱ<EFBFBD><CAB1> */
|
||||||
at_return ret; /* <20><><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>*/
|
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 busy : 1;
|
||||||
unsigned char suspend: 1;
|
unsigned char suspend: 1;
|
||||||
unsigned char dowork : 1;
|
unsigned char dowork : 1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user