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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章