From 93c7ab71ffa25680196fdfa00b032cd7617af415 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=94=E7=BD=97=E6=8A=80=E6=9C=AF?= Date: Wed, 3 Mar 2021 20:51:14 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=A7=A3=E5=86=B3=E6=9C=AA=E6=B8=85=E9=99=A4?= =?UTF-8?q?URC=E8=AE=A1=E6=95=B0=E5=99=A8=E5=AF=BC=E8=87=B4=E9=A2=91?= =?UTF-8?q?=E7=B9=81=E6=89=93=E5=8D=B0=E6=8E=A5=E6=94=B6=E8=B6=85=E6=97=B6?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=202.=E5=A2=9E=E5=8A=A0URC=E6=BC=94?= =?UTF-8?q?=E7=A4=BA=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Demo/AT-Command/at_chat.c | 17 +++++---- Demo/AT-Command/at_chat.h | 1 + Demo/user/task/wifi_task.c | 72 ++++++++++++++++++++++++++++---------- at_chat.c | 17 +++++---- at_chat.h | 1 + 5 files changed, 75 insertions(+), 33 deletions(-) diff --git a/Demo/AT-Command/at_chat.c b/Demo/AT-Command/at_chat.c index 5322174..f499904 100644 --- a/Demo/AT-Command/at_chat.c +++ b/Demo/AT-Command/at_chat.c @@ -10,6 +10,7 @@ * 2020-01-02 Morro 初版 * 2021-01-20 Morro 增加debug调试接口, 解决链表未初始化导至段错误的问题 * 调通单行命令、多行命令、自定义命令等接口 + * 2021-03-03 Morro 解决未清除URC计数器导致频繁打印接收超时的问题 ******************************************************************************/ #include "at_chat.h" @@ -345,6 +346,7 @@ static void urc_handler_entry(at_obj_t *at, char *urc, unsigned int size) static void urc_recv_process(at_obj_t *at, char *buf, unsigned int size) { char *urc_buf; + int ch; unsigned short urc_size; urc_buf = (char *)at->adap.urc_buf; urc_size = at->adap.urc_bufsize; @@ -352,20 +354,21 @@ static void urc_recv_process(at_obj_t *at, char *buf, unsigned int size) if (size == 0 && at->urc_cnt > 0) { if (AT_IS_TIMEOUT(at->urc_timer, 2000)) { /* 接收超时*/ urc_handler_entry(at, urc_buf, at->urc_cnt); - at->recv_cnt = 0; + at->urc_cnt = 0; AT_DEBUG("Urc recv timeout.\r\n"); } } else if (urc_buf != NULL){ at->urc_timer = AT_GET_TICK(); while (size--) { - if (*buf == '\n') { /*逐行处理*/ + ch = *buf++; + urc_buf[at->urc_cnt++] = ch; + if (ch == '\n' || ch == '\r' || ch == '\0') { /*urc结束符*/ urc_buf[at->urc_cnt] = '\0'; - urc_handler_entry(at, urc_buf, at->urc_cnt); - } else { - urc_buf[at->urc_cnt++] = *buf++; - if (at->urc_cnt >= urc_size) /* 溢出处理 */ + if (at->urc_cnt > 2) + urc_handler_entry(at, urc_buf, at->urc_cnt); + at->urc_cnt = 0; + } else if (at->urc_cnt >= urc_size) /* 溢出处理 */ at->urc_cnt = 0; - } } } } diff --git a/Demo/AT-Command/at_chat.h b/Demo/AT-Command/at_chat.h index 0f6e397..39426e7 100644 --- a/Demo/AT-Command/at_chat.h +++ b/Demo/AT-Command/at_chat.h @@ -10,6 +10,7 @@ * 2020-01-02 Morro 初版 * 2021-01-20 Morro 增加debug调试接口, 解决链表未初始化导至段错误的问题 * 调通单行命令、多行命令、自定义命令等接口 + * 2021-03-03 Morro 解决未清除URC计数器导致频繁打印接收超时的问题 ******************************************************************************/ #ifndef _ATCHAT_H_ diff --git a/Demo/user/task/wifi_task.c b/Demo/user/task/wifi_task.c index d608134..871c45a 100644 --- a/Demo/user/task/wifi_task.c +++ b/Demo/user/task/wifi_task.c @@ -7,15 +7,25 @@ * * Change Logs: * Date Author Notes - * 2021/01/20 Morro + * 2021-01-20 Morro 初版 + * 2021-03-03 Morro 增加URC使用案例 ******************************************************************************/ #include "at_chat.h" #include "wifi_uart.h" #include "public.h" #include "module.h" +#include "cli.h" #include #include +/* Private function prototypes -----------------------------------------------*/ +void wifi_open(void); +void wifi_close(void); +static void at_error(void); +void wifi_query_version(void); +void wifi_ready_handler(char *recvbuf, int size); +void wifi_connected_handler(char *recvbuf, int size); +void wifi_disconnected_handler(char *recvbuf, int size); /* Private variables ---------------------------------------------------------*/ /* @@ -23,25 +33,24 @@ */ static at_obj_t at; - -/* Private function prototypes -----------------------------------------------*/ -void wifi_open(void); -void wifi_close(void); -static void at_error(void); -void wifi_query_version(void); - -/* Private functions ---------------------------------------------------------*/ -/* - * @brief wifi urc缓冲区 - */ -//static unsigned char wifi_urcbuf[256]; - /* * @brief wifi 数据接收缓冲区 */ static unsigned char wifi_recvbuf[256]; +/* + * @brief wifi URC接收缓冲区 + */ +static unsigned char wifi_urcbuf[128]; +/* + * @brief wifi URC表 + */ +static const utc_item_t urc_table[] = { + "ready", wifi_ready_handler, + "WIFI CONNECTED:", wifi_connected_handler, + "WIFI DISCONNECTED", wifi_disconnected_handler, +}; /* * @brief AT适配器 @@ -50,14 +59,39 @@ static const at_adapter_t at_adapter = { .write = wifi_uart_write, .read = wifi_uart_read, .error = at_error, - .utc_tbl = NULL, - .urc_buf = NULL, + .utc_tbl = (utc_item_t *)urc_table, + .urc_buf = wifi_urcbuf, .recv_buf = wifi_recvbuf, - .urc_tbl_count = 0, - .urc_bufsize = 0, + .urc_tbl_count = sizeof(urc_table) / sizeof(urc_table[0]), + .urc_bufsize = sizeof(wifi_urcbuf), .recv_bufsize = sizeof(wifi_recvbuf) }; +/* Private functions ---------------------------------------------------------*/ + +/* + * @brief wifi开机就绪事件 + */ +void wifi_ready_handler(char *recvbuf, int size) +{ + printf("WIFI ready...\r\n"); +} + +/* + * @brief wifi连接事件 + */ +static void wifi_connected_handler(char *recvbuf, int size) +{ + printf("WIFI connection detected...\r\n"); +} +/* + * @brief wifi断开连接事件 + */ +static void wifi_disconnected_handler(char *recvbuf, int size) +{ + printf("WIFI disconnect detected...\r\n"); +} + /* * @brief 打开wifi */ @@ -98,7 +132,7 @@ static int wifi_reset_work(at_env_t *e) e->state++; break; case 3: - if (e->is_timeout(a, 2000)) //延时等待2s + if (e->is_timeout(a, 5000)) //大约延时等待5s至wifi启动 return true; break; } diff --git a/at_chat.c b/at_chat.c index 5322174..f499904 100644 --- a/at_chat.c +++ b/at_chat.c @@ -10,6 +10,7 @@ * 2020-01-02 Morro 初版 * 2021-01-20 Morro 增加debug调试接口, 解决链表未初始化导至段错误的问题 * 调通单行命令、多行命令、自定义命令等接口 + * 2021-03-03 Morro 解决未清除URC计数器导致频繁打印接收超时的问题 ******************************************************************************/ #include "at_chat.h" @@ -345,6 +346,7 @@ static void urc_handler_entry(at_obj_t *at, char *urc, unsigned int size) static void urc_recv_process(at_obj_t *at, char *buf, unsigned int size) { char *urc_buf; + int ch; unsigned short urc_size; urc_buf = (char *)at->adap.urc_buf; urc_size = at->adap.urc_bufsize; @@ -352,20 +354,21 @@ static void urc_recv_process(at_obj_t *at, char *buf, unsigned int size) if (size == 0 && at->urc_cnt > 0) { if (AT_IS_TIMEOUT(at->urc_timer, 2000)) { /* 接收超时*/ urc_handler_entry(at, urc_buf, at->urc_cnt); - at->recv_cnt = 0; + at->urc_cnt = 0; AT_DEBUG("Urc recv timeout.\r\n"); } } else if (urc_buf != NULL){ at->urc_timer = AT_GET_TICK(); while (size--) { - if (*buf == '\n') { /*逐行处理*/ + ch = *buf++; + urc_buf[at->urc_cnt++] = ch; + if (ch == '\n' || ch == '\r' || ch == '\0') { /*urc结束符*/ urc_buf[at->urc_cnt] = '\0'; - urc_handler_entry(at, urc_buf, at->urc_cnt); - } else { - urc_buf[at->urc_cnt++] = *buf++; - if (at->urc_cnt >= urc_size) /* 溢出处理 */ + if (at->urc_cnt > 2) + urc_handler_entry(at, urc_buf, at->urc_cnt); + at->urc_cnt = 0; + } else if (at->urc_cnt >= urc_size) /* 溢出处理 */ at->urc_cnt = 0; - } } } } diff --git a/at_chat.h b/at_chat.h index 0f6e397..39426e7 100644 --- a/at_chat.h +++ b/at_chat.h @@ -10,6 +10,7 @@ * 2020-01-02 Morro 初版 * 2021-01-20 Morro 增加debug调试接口, 解决链表未初始化导至段错误的问题 * 调通单行命令、多行命令、自定义命令等接口 + * 2021-03-03 Morro 解决未清除URC计数器导致频繁打印接收超时的问题 ******************************************************************************/ #ifndef _ATCHAT_H_