mirror of
https://gitee.com/moluo-tech/AT-Command.git
synced 2025-02-05 17:28:23 +08:00
增加接收锁,解决执行at_do_work时urc部分数据丢失问题
This commit is contained in:
parent
76d13e373b
commit
321be4256f
108
at.c
108
at.c
@ -15,6 +15,7 @@
|
|||||||
* 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>
|
* 2021-05-15 Morro <EFBFBD>Ż<EFBFBD>URCƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* 2021-07-20 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>at_do_workʱurc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
******************************************************************************
|
******************************************************************************
|
||||||
*/
|
*/
|
||||||
#include "at.h"
|
#include "at.h"
|
||||||
@ -24,6 +25,10 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#define MAX_AT_LOCK_TIME 60 * 1000 //AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||||
|
|
||||||
|
static void urc_recv_process(at_obj_t *at, const char *buf, unsigned int size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Ĭ<EFBFBD>ϵ<EFBFBD><EFBFBD>Խӿ<EFBFBD>
|
* @brief Ĭ<EFBFBD>ϵ<EFBFBD><EFBFBD>Խӿ<EFBFBD>
|
||||||
*/
|
*/
|
||||||
@ -39,7 +44,6 @@ static void put_string(at_obj_t *at, const char *s)
|
|||||||
at->adap.write(s++, 1);
|
at->adap.write(s++, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||||
*/
|
*/
|
||||||
@ -50,8 +54,28 @@ static void put_line(at_obj_t *at, const char *s)
|
|||||||
at->adap.debug("->\r\n%s\r\n", s);
|
at->adap.debug("->\r\n%s\r\n", s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief <EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*/
|
||||||
|
static unsigned int at_work_read(struct at_work_ctx *e, void *buf, unsigned int len)
|
||||||
|
{
|
||||||
|
at_obj_t *at = e->at;
|
||||||
|
len = at->adap.read(buf, len);
|
||||||
|
urc_recv_process(at, buf, len); //<2F>ݽ<EFBFBD><DDBD><EFBFBD>URC<52><43><EFBFBD>д<EFBFBD><D0B4><EFBFBD>
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief <EFBFBD><EFBFBD>ҵд<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*/
|
||||||
|
static unsigned int at_work_write(struct at_work_ctx *e, const void *buf, unsigned int len)
|
||||||
|
{
|
||||||
|
return e->at->adap.write(buf, len);
|
||||||
|
}
|
||||||
|
|
||||||
//<2F><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>
|
//<2F><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>
|
||||||
static void at_print(struct at_work_ctx *e, const char *cmd, ...)
|
static void at_work_print(struct at_work_ctx *e, const char *cmd, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
va_start(args, cmd);
|
va_start(args, cmd);
|
||||||
@ -61,14 +85,6 @@ static void at_print(struct at_work_ctx *e, const char *cmd, ...)
|
|||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
*/
|
|
||||||
static void recvbuf_clr(struct at_work_ctx *e)
|
|
||||||
{
|
|
||||||
e->at->rcv_cnt = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//<2F>ȴ<EFBFBD>AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
|
//<2F>ȴ<EFBFBD>AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
|
||||||
static at_return wait_resp(at_obj_t *at, at_respond_t *r)
|
static at_return wait_resp(at_obj_t *at, at_respond_t *r)
|
||||||
{
|
{
|
||||||
@ -87,8 +103,7 @@ static at_return wait_resp(at_obj_t *at, at_respond_t *r)
|
|||||||
* @param[in] resp - <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD>(<EFBFBD><EFBFBD>"OK",">")
|
* @param[in] resp - <EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD>(<EFBFBD><EFBFBD>"OK",">")
|
||||||
* @param[in] timeout - <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD>
|
* @param[in] timeout - <EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
at_return wait_recv(struct at_work_ctx *e, const char *resp,
|
at_return wait_recv(struct at_work_ctx *e, const char *resp, unsigned int timeout)
|
||||||
unsigned int timeout)
|
|
||||||
{
|
{
|
||||||
char buf[64];
|
char buf[64];
|
||||||
int cnt = 0, len;
|
int cnt = 0, len;
|
||||||
@ -96,17 +111,19 @@ at_return wait_recv(struct at_work_ctx *e, const char *resp,
|
|||||||
at_return ret = AT_RET_TIMEOUT;
|
at_return ret = AT_RET_TIMEOUT;
|
||||||
unsigned int timer = at_get_ms();
|
unsigned int timer = at_get_ms();
|
||||||
while (at_get_ms() - timer < timeout) {
|
while (at_get_ms() - timer < timeout) {
|
||||||
len = at->adap.read(buf, sizeof(buf) - cnt);
|
len = e->read(e, &buf[cnt], sizeof(buf) - cnt);
|
||||||
cnt += len;
|
if (len > 0) {
|
||||||
buf[cnt] = '\0';
|
cnt += len;
|
||||||
if (strstr(buf, resp)) {
|
buf[cnt] = '\0';
|
||||||
ret = AT_RET_OK;
|
if (strstr(buf, resp)) {
|
||||||
break;
|
ret = AT_RET_OK;
|
||||||
} else if (strstr(buf, "ERROR")) {
|
break;
|
||||||
ret = AT_RET_ERROR;
|
} else if (strstr(buf, "ERROR")) {
|
||||||
break;
|
ret = AT_RET_ERROR;
|
||||||
}
|
break;
|
||||||
at_delay(10);
|
}
|
||||||
|
} else
|
||||||
|
at_delay(1);
|
||||||
}
|
}
|
||||||
at->adap.debug("%s\r\n", buf);
|
at->adap.debug("%s\r\n", buf);
|
||||||
return ret;
|
return ret;
|
||||||
@ -119,10 +136,10 @@ at_return wait_recv(struct at_work_ctx *e, const char *resp,
|
|||||||
void at_obj_init(at_obj_t *at, const at_adapter_t *adap)
|
void at_obj_init(at_obj_t *at, const at_adapter_t *adap)
|
||||||
{
|
{
|
||||||
at->adap = *adap;
|
at->adap = *adap;
|
||||||
at->rcv_cnt = 0;
|
at->rcv_cnt = 0;
|
||||||
|
at->send_lock = at_sem_new(1);
|
||||||
at->cmd_lock = ril_sem_new(1);
|
at->recv_lock = at_sem_new(1);
|
||||||
at->completed = ril_sem_new(0);
|
at->completed = at_sem_new(0);
|
||||||
at->urc_item = NULL;
|
at->urc_item = NULL;
|
||||||
if (at->adap.debug == NULL)
|
if (at->adap.debug == NULL)
|
||||||
at->adap.debug = nop_dbg;
|
at->adap.debug = nop_dbg;
|
||||||
@ -143,7 +160,7 @@ at_return at_do_cmd(at_obj_t *at, at_respond_t *r, const char *cmd)
|
|||||||
if (r == NULL) {
|
if (r == NULL) {
|
||||||
r = &default_resp; //Ĭ<><C4AC><EFBFBD><EFBFBD>Ӧ
|
r = &default_resp; //Ĭ<><C4AC><EFBFBD><EFBFBD>Ӧ
|
||||||
}
|
}
|
||||||
if (!at_sem_wait(at->cmd_lock, r->timeout)) {
|
if (!at_sem_wait(at->send_lock, r->timeout)) {
|
||||||
return AT_RET_TIMEOUT;
|
return AT_RET_TIMEOUT;
|
||||||
}
|
}
|
||||||
at->busy = true;
|
at->busy = true;
|
||||||
@ -153,7 +170,7 @@ at_return at_do_cmd(at_obj_t *at, at_respond_t *r, const char *cmd)
|
|||||||
}
|
}
|
||||||
put_line(at, cmd);
|
put_line(at, cmd);
|
||||||
ret = wait_resp(at, r);
|
ret = wait_resp(at, r);
|
||||||
at_sem_post(at->cmd_lock);
|
at_sem_post(at->send_lock);
|
||||||
at->busy = false;
|
at->busy = false;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -169,26 +186,25 @@ int at_do_work(at_obj_t *at, at_work work, void *params)
|
|||||||
{
|
{
|
||||||
at_work_ctx_t ctx;
|
at_work_ctx_t ctx;
|
||||||
int ret;
|
int ret;
|
||||||
if (!at_sem_wait(at->cmd_lock, 150 * 1000)) {
|
if (!at_sem_wait(at->send_lock, MAX_AT_LOCK_TIME)) {
|
||||||
return AT_RET_TIMEOUT;
|
return AT_RET_TIMEOUT;
|
||||||
}
|
}
|
||||||
|
if (!at_sem_wait(at->recv_lock, MAX_AT_LOCK_TIME))
|
||||||
|
return AT_RET_TIMEOUT;
|
||||||
|
|
||||||
at->busy = true;
|
at->busy = true;
|
||||||
while (at->urc_cnt) { //<2F>ȴ<EFBFBD>URC<52><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
at_delay(1);
|
|
||||||
}
|
|
||||||
//<2F><><EFBFBD><EFBFBD>at_work_ctx_t
|
//<2F><><EFBFBD><EFBFBD>at_work_ctx_t
|
||||||
ctx.params = params;
|
ctx.params = params;
|
||||||
ctx.printf = at_print;
|
ctx.printf = at_work_print;
|
||||||
ctx.recvclr = recvbuf_clr;
|
ctx.read = at_work_read;
|
||||||
ctx.read = at->adap.read;
|
ctx.write = at_work_write;
|
||||||
ctx.write = at->adap.write;
|
|
||||||
ctx.wait_resp = wait_recv;
|
ctx.wait_resp = wait_recv;
|
||||||
ctx.at = at;
|
ctx.at = at;
|
||||||
at->dowork = true;
|
|
||||||
at->rcv_cnt = 0;
|
at->rcv_cnt = 0;
|
||||||
ret = work(&ctx);
|
ret = work(&ctx);
|
||||||
at->dowork = false;
|
at_sem_post(at->recv_lock);
|
||||||
at_sem_post(at->cmd_lock);
|
at_sem_post(at->send_lock);
|
||||||
at->busy = false;
|
at->busy = false;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -381,13 +397,15 @@ void at_resume(at_obj_t *at)
|
|||||||
*/
|
*/
|
||||||
void at_process(at_obj_t *at)
|
void at_process(at_obj_t *at)
|
||||||
{
|
{
|
||||||
char c;
|
char buf[16];
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
if (at->dowork) /* <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6> */
|
if (!at_sem_wait(at->recv_lock, MAX_AT_LOCK_TIME))
|
||||||
return;
|
return;
|
||||||
do {
|
do {
|
||||||
len = at->adap.read(&c, 1);
|
len = at->adap.read(buf, sizeof(buf));
|
||||||
urc_recv_process(at, &c,len);
|
urc_recv_process(at, buf,len);
|
||||||
resp_recv_process(at, &c, len);
|
resp_recv_process(at, buf, len);
|
||||||
} while (len);
|
} while (len);
|
||||||
|
|
||||||
|
at_sem_post(at->recv_lock);
|
||||||
}
|
}
|
||||||
|
64
at.h
64
at.h
@ -14,6 +14,7 @@
|
|||||||
* 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>
|
* 2021-05-15 Morro <EFBFBD>Ż<EFBFBD>URCƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
* 2021-07-20 Morro <EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><EFBFBD>at_do_workʱurc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ʧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#ifndef _AT_H_
|
#ifndef _AT_H_
|
||||||
@ -74,44 +75,70 @@ typedef struct {
|
|||||||
void (*handler)(at_urc_ctx_t *ctx);
|
void (*handler)(at_urc_ctx_t *ctx);
|
||||||
}urc_item_t;
|
}urc_item_t;
|
||||||
|
|
||||||
/**AT<41>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------------------------------------------*/
|
/**
|
||||||
|
* @brief AT<EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD>AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
|
||||||
|
/**
|
||||||
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ӿ<EFBFBD>
|
||||||
|
*/
|
||||||
unsigned int (*write)(const void *buf, unsigned int len);
|
unsigned int (*write)(const void *buf, unsigned int len);
|
||||||
//<2F><><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
|
/**
|
||||||
|
* @brief <EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><EFBFBD>ӿ<EFBFBD>
|
||||||
|
*/
|
||||||
unsigned int (*read)(void *buf, unsigned int len);
|
unsigned int (*read)(void *buf, unsigned int len);
|
||||||
//<2F><><EFBFBD>Դ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
|
/**
|
||||||
|
* @brief <EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><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
|
|
||||||
|
/**
|
||||||
|
* @brief urc <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL
|
||||||
|
*/
|
||||||
urc_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
|
/**
|
||||||
|
* @brief urc<EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><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
|
/**
|
||||||
|
* @brief utc_tbl<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
||||||
|
*/
|
||||||
unsigned short urc_tbl_count;
|
unsigned short urc_tbl_count;
|
||||||
//urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>0
|
/**
|
||||||
|
* @brief urc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
|
||||||
|
*/
|
||||||
unsigned short urc_bufsize;
|
unsigned short urc_bufsize;
|
||||||
}at_adapter_t;
|
}at_adapter_t;
|
||||||
|
|
||||||
/*AT<41><54>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> -----------------------------------------------------------------*/
|
/**
|
||||||
|
* @brief AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *matcher; /* <20><><EFBFBD><EFBFBD>ƥ<EFBFBD>䴮 */
|
const char *matcher; /* <20><><EFBFBD><EFBFBD>ƥ<EFBFBD>䴮 */
|
||||||
char *recvbuf; /* <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD> */
|
char *recvbuf; /* <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD> */
|
||||||
unsigned short bufsize; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
unsigned short bufsize; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||||
unsigned int timeout; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1> */
|
unsigned int timeout; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1> */
|
||||||
}at_respond_t;
|
} at_respond_t;
|
||||||
|
|
||||||
/** work context ------------------------------------------------------------*/
|
/** work context ------------------------------------------------------------*/
|
||||||
/**
|
/**
|
||||||
* @brief AT<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Work Context) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
* @brief AT<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Work Context) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
*/
|
*/
|
||||||
typedef struct at_work_ctx {
|
typedef struct at_work_ctx {
|
||||||
struct at_obj *at;
|
struct at_obj *at;
|
||||||
|
|
||||||
//<2F><>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>,<2C><>at_do_work<72>ӿڴ<D3BF><DAB4><EFBFBD>
|
//<2F><>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>,<2C><>at_do_work<72>ӿڴ<D3BF><DAB4><EFBFBD>
|
||||||
void *params;
|
void *params;
|
||||||
|
/**
|
||||||
unsigned int (*write)(const void *buf, unsigned int len);
|
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*/
|
||||||
unsigned int (*read)(void *buf, unsigned int len);
|
unsigned int (*write)(struct at_work_ctx *self, const void *buf, unsigned int len);
|
||||||
|
/**
|
||||||
|
* @brief <EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
*/
|
||||||
|
unsigned int (*read)(struct at_work_ctx *self, void *buf, unsigned int len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
* @brief <EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
@ -124,14 +151,14 @@ typedef struct at_work_ctx {
|
|||||||
*/
|
*/
|
||||||
at_return (*wait_resp)(struct at_work_ctx *self, const char *prefix,
|
at_return (*wait_resp)(struct at_work_ctx *self, const char *prefix,
|
||||||
unsigned int timeout);
|
unsigned int timeout);
|
||||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
|
||||||
void (*recvclr)(struct at_work_ctx *self);
|
|
||||||
}at_work_ctx_t;
|
}at_work_ctx_t;
|
||||||
|
|
||||||
|
|
||||||
/*AT<41><54><EFBFBD><EFBFBD> ---------------------------------------------------------------------*/
|
/*AT<41><54><EFBFBD><EFBFBD> ---------------------------------------------------------------------*/
|
||||||
typedef struct at_obj {
|
typedef struct at_obj {
|
||||||
at_adapter_t adap; /* <20>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
at_adapter_t adap; /* <20>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||||
at_sem_t cmd_lock; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
at_sem_t send_lock; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||||||
|
at_sem_t recv_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>*/
|
const urc_item_t *urc_item; /* <20><>ǰURC<52><43>*/
|
||||||
@ -160,6 +187,7 @@ int at_split_respond_lines(char *recvbuf, char *lines[], int count, char separat
|
|||||||
|
|
||||||
int at_do_work(at_obj_t *at, at_work work, void *params); /* <20>Զ<EFBFBD><D4B6><EFBFBD>AT<41><54>ҵ*/
|
int at_do_work(at_obj_t *at, at_work work, void *params); /* <20>Զ<EFBFBD><D4B6><EFBFBD>AT<41><54>ҵ*/
|
||||||
|
|
||||||
|
|
||||||
void at_process(at_obj_t *at); /* AT<41><54><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>*/
|
void at_process(at_obj_t *at); /* AT<41><54><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>*/
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user