1.解决未清除URC计数器导致频繁打印接收超时的问题

2.增加URC演示程序
This commit is contained in:
魔罗技术 2021-03-03 20:51:14 +08:00
parent 3d482232c8
commit 93c7ab71ff
5 changed files with 75 additions and 33 deletions

View File

@ -10,6 +10,7 @@
* 2020-01-02 Morro * 2020-01-02 Morro
* 2021-01-20 Morro debug调试接口, * 2021-01-20 Morro debug调试接口,
* *
* 2021-03-03 Morro URC计数器导致频繁打印接收超时的问题
******************************************************************************/ ******************************************************************************/
#include "at_chat.h" #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) static void urc_recv_process(at_obj_t *at, char *buf, unsigned int size)
{ {
char *urc_buf; char *urc_buf;
int ch;
unsigned short urc_size; unsigned short urc_size;
urc_buf = (char *)at->adap.urc_buf; urc_buf = (char *)at->adap.urc_buf;
urc_size = at->adap.urc_bufsize; 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 (size == 0 && at->urc_cnt > 0) {
if (AT_IS_TIMEOUT(at->urc_timer, 2000)) { /* 接收超时*/ if (AT_IS_TIMEOUT(at->urc_timer, 2000)) { /* 接收超时*/
urc_handler_entry(at, urc_buf, at->urc_cnt); urc_handler_entry(at, urc_buf, at->urc_cnt);
at->recv_cnt = 0; at->urc_cnt = 0;
AT_DEBUG("Urc recv timeout.\r\n"); AT_DEBUG("Urc recv timeout.\r\n");
} }
} else if (urc_buf != NULL){ } else if (urc_buf != NULL){
at->urc_timer = AT_GET_TICK(); at->urc_timer = AT_GET_TICK();
while (size--) { 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_buf[at->urc_cnt] = '\0';
urc_handler_entry(at, urc_buf, at->urc_cnt); if (at->urc_cnt > 2)
} else { urc_handler_entry(at, urc_buf, at->urc_cnt);
urc_buf[at->urc_cnt++] = *buf++; at->urc_cnt = 0;
if (at->urc_cnt >= urc_size) /* 溢出处理 */ } else if (at->urc_cnt >= urc_size) /* 溢出处理 */
at->urc_cnt = 0; at->urc_cnt = 0;
}
} }
} }
} }

View File

@ -10,6 +10,7 @@
* 2020-01-02 Morro * 2020-01-02 Morro
* 2021-01-20 Morro debug调试接口, * 2021-01-20 Morro debug调试接口,
* *
* 2021-03-03 Morro URC计数器导致频繁打印接收超时的问题
******************************************************************************/ ******************************************************************************/
#ifndef _ATCHAT_H_ #ifndef _ATCHAT_H_

View File

@ -7,15 +7,25 @@
* *
* Change Logs: * Change Logs:
* Date Author Notes * Date Author Notes
* 2021/01/20 Morro * 2021-01-20 Morro
* 2021-03-03 Morro URC使用案例
******************************************************************************/ ******************************************************************************/
#include "at_chat.h" #include "at_chat.h"
#include "wifi_uart.h" #include "wifi_uart.h"
#include "public.h" #include "public.h"
#include "module.h" #include "module.h"
#include "cli.h"
#include <stdio.h> #include <stdio.h>
#include <stdbool.h> #include <stdbool.h>
/* 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 ---------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/
/* /*
@ -23,25 +33,24 @@
*/ */
static at_obj_t at; 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 * @brief wifi
*/ */
static unsigned char wifi_recvbuf[256]; 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适配器 * @brief AT适配器
@ -50,14 +59,39 @@ static const at_adapter_t at_adapter = {
.write = wifi_uart_write, .write = wifi_uart_write,
.read = wifi_uart_read, .read = wifi_uart_read,
.error = at_error, .error = at_error,
.utc_tbl = NULL, .utc_tbl = (utc_item_t *)urc_table,
.urc_buf = NULL, .urc_buf = wifi_urcbuf,
.recv_buf = wifi_recvbuf, .recv_buf = wifi_recvbuf,
.urc_tbl_count = 0, .urc_tbl_count = sizeof(urc_table) / sizeof(urc_table[0]),
.urc_bufsize = 0, .urc_bufsize = sizeof(wifi_urcbuf),
.recv_bufsize = sizeof(wifi_recvbuf) .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 * @brief wifi
*/ */
@ -98,7 +132,7 @@ static int wifi_reset_work(at_env_t *e)
e->state++; e->state++;
break; break;
case 3: case 3:
if (e->is_timeout(a, 2000)) //ÑÓʱµÈ´ý2s if (e->is_timeout(a, 5000)) //大约延时等待5s至wifi启动
return true; return true;
break; break;
} }

View File

@ -10,6 +10,7 @@
* 2020-01-02 Morro * 2020-01-02 Morro
* 2021-01-20 Morro debug调试接口, * 2021-01-20 Morro debug调试接口,
* *
* 2021-03-03 Morro URC计数器导致频繁打印接收超时的问题
******************************************************************************/ ******************************************************************************/
#include "at_chat.h" #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) static void urc_recv_process(at_obj_t *at, char *buf, unsigned int size)
{ {
char *urc_buf; char *urc_buf;
int ch;
unsigned short urc_size; unsigned short urc_size;
urc_buf = (char *)at->adap.urc_buf; urc_buf = (char *)at->adap.urc_buf;
urc_size = at->adap.urc_bufsize; 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 (size == 0 && at->urc_cnt > 0) {
if (AT_IS_TIMEOUT(at->urc_timer, 2000)) { /* 接收超时*/ if (AT_IS_TIMEOUT(at->urc_timer, 2000)) { /* 接收超时*/
urc_handler_entry(at, urc_buf, at->urc_cnt); urc_handler_entry(at, urc_buf, at->urc_cnt);
at->recv_cnt = 0; at->urc_cnt = 0;
AT_DEBUG("Urc recv timeout.\r\n"); AT_DEBUG("Urc recv timeout.\r\n");
} }
} else if (urc_buf != NULL){ } else if (urc_buf != NULL){
at->urc_timer = AT_GET_TICK(); at->urc_timer = AT_GET_TICK();
while (size--) { 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_buf[at->urc_cnt] = '\0';
urc_handler_entry(at, urc_buf, at->urc_cnt); if (at->urc_cnt > 2)
} else { urc_handler_entry(at, urc_buf, at->urc_cnt);
urc_buf[at->urc_cnt++] = *buf++; at->urc_cnt = 0;
if (at->urc_cnt >= urc_size) /* 溢出处理 */ } else if (at->urc_cnt >= urc_size) /* 溢出处理 */
at->urc_cnt = 0; at->urc_cnt = 0;
}
} }
} }
} }

View File

@ -10,6 +10,7 @@
* 2020-01-02 Morro * 2020-01-02 Morro
* 2021-01-20 Morro debug调试接口, * 2021-01-20 Morro debug调试接口,
* *
* 2021-03-03 Morro URC计数器导致频繁打印接收超时的问题
******************************************************************************/ ******************************************************************************/
#ifndef _ATCHAT_H_ #ifndef _ATCHAT_H_