記錄自己採坑的過程,不認真看函數。
採用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;
}