RT_thread AT组件URC 数据处理遇到的问题

  记录自己采坑的过程,不认真看函数。

  采用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;
  }

 

发布了43 篇原创文章 · 获赞 177 · 访问量 14万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章