记录自己采坑的过程,不认真看函数。
采用RT_thread官网给出的 AT Client URC 数据处理的例子 。参考https://www.rt-thread.org/document/site/programming- manual/at/at/#at-client-urc
主要代码如下:
static void urc_conn_func(const char *data, rt_size_t size)
{
/* WIFI 连接成功信息 */
LOG_D("AT Server device WIFI connect success!");
}
static void urc_recv_func(const char *data, rt_size_t size)
{
/* 接收到服务器发送数据 */
LOG_D("AT Client receive AT Server data!");
}
static void urc_func(const char *data, rt_size_t size)
{
/* 设备启动信息 */
LOG_D("AT Server device startup!");
}
static struct at_urc urc_table[] = {
{"WIFI CONNECTED", "\r\n", urc_conn_func},
{"+RECV", ":", urc_recv_func},
{"RDY", "\r\n", urc_func},
};
int at_client_port_init(void)
{
/* 添加多种 URC 数据至 URC 列表中,当接收到同时匹配 URC 前缀和后缀的数据,执行 URC 函数 */
at_set_urc_table(urc_table, sizeof(urc_table) / sizeof(urc_table[0]));
return RT_EOK;
}
直接贴上这段代码,在keil5中有警告提示。。(开始的时候我直接没管警告,然后无论怎样都无法识别定义的URC数据)
警告信息如下:
applications\air720h.c(83): warning: #144-D: a value of type "void (*)(const char *, rt_size_t)" cannot be used to initialize an entity of type "void (*)(struct at_client *, const char *, rt_size_t)"
后来仔细一看,才知道 AT文档里面中URC函数太老了,少了第一个参数 at_client 的设置。
新的at_urc结构体定义如下:
struct at_urc
{
const char *cmd_prefix;
const char *cmd_suffix;
void (*func)(struct at_client *client, const char *data, rt_size_t size);
};
而之前官网文档的at_urc结构体定义:
struct at_urc
{
const char *cmd_prefix; // URC 数据前缀
const char *cmd_suffix; // URC 数据后缀
void (*func)(const char *data, rt_size_t size); // URC 数据执行函数
};
所以我们加上这个参数即可,如下所示:
static void urc_conn_func(struct at_client *client ,const char *data, rt_size_t size)
{
/* WIFI 连接成功信息 */
LOG_D("AT Server device WIFI connect success!");
}
static void urc_recv_func(struct at_client *client, const char *data, rt_size_t size)
{
/* 接收到服务器发送数据 */
LOG_D("AT Client receive AT Server data!");
}
static void urc_func(struct at_client *client, const char *data, rt_size_t size)
{
/* 设备启动信息 */
LOG_D("AT Server device startup!");
}
static struct at_urc urc_table[] = {
{"WIFI CONNECTED", "\r\n", urc_conn_func},
{"+RECV", ":", urc_recv_func},
{"SMS", "READY", urc_func},
};
实际在调试过程中,是收到了响应的数据,但是却没有进行串口打印响应的提示字符。
即LOG_D()这个函数似乎得到相应的功能 ,而使用LOG_E即可打印(),使用rt_kprintf()函数也可以进行打印。我想应该是
在ulog中设置了当前文件设定及全局设定的日志输出级别的问题导致。
2020.2.3 记录一个关于 AT URC中自己采坑的一个问题。
已知上述URC中设定了如下几个URC列表
static struct at_urc urc_table[] = {
{"WIFI CONNECTED", "\r\n", urc_conn_func},
{"+RECV", ":", urc_recv_func},
{"RDY", "\r\n", urc_func},
};
假设我们在后面做AT client 时,通过 发送AT指令,而期待的返回 又在URC列表中(如下的 RDY),那么URC对应的检测到的函数会执行,但是如下的 AT指令返回检测就没有。
/*此项和URC数据响应的数据一致,出现了冲突*/
at_resp_set_info(resp,200, 0, rt_tick_from_millisecond(5000)); /*重新配置响应结构体*/
/*查询是否检测到SIM卡 AT+CPIN?, RDY */
if (at_exec_cmd(resp,"AT+CPIN?") != RT_EOK)
{
LOG_E("AT+CPIN? send commands failed , response error or timeout !");
return -RT_ETIMEOUT;
}
resp__buf_data=at_resp_get_line_by_kw(resp,"RDY");
if(resp__buf_data==RT_NULL)
{
LOG_E("未检测到SIM卡");
return -RT_EBUSY;
}