Rtthread學習筆記(二十一)RT-Thread使用Esp8266,配置其AT Client URC數據處理

一、使用URC

esp8266作爲AT服務器,STM32作爲AT客戶端,之間採用AT指令集進行操作,(esp8266進入透傳模式後,stm32再發的AT指令將失效,會當做是透傳數據被esp8266直接轉發),正常情況下,都是stm32發一條AT指令,esp8266會反饋一條數據,這時候直接採用at_client的相關接口函數就可以進行AT指令的發送與迴應數據處理;但還存在esp8266作爲AT服務器會主動下發數據的情況,而不是迴應數據,產生的這種情況有2種原因:
1、esp8266出現網絡連接失敗,斷開等原因,會主動下發CLOSED\r\n、WIFI DISCONNECT\r\n等指令;
2、esp8266接收到來自網絡服務器的數據,轉發給stm32的數據。

針對這種AT服務器主動下發指令的情況,在RTThread中的AT命令部分存在一種數據處理方式,便是AT Client URC 數據處理。AT命令章節

URC 數據爲服務器主動下發的數據,不能通過AT數據發送接收函數接收,並且對於不同設備 URC 數據格式和功能不一樣,所以 URC 數據處理的方式也是需要用戶自定義實現的。AT 組件中對 URC 數據的處理提供列表管理方式,用戶可自定義添加 URC 數據和其執行函數到管理列表中。
在這裏插入圖片描述
針對esp8266,這種URC數據處理方式適合處理上述的第一種原因,沒有特殊要求不建議處理直接通過網絡服務器發來的數據,因爲URC處理一些意外情況,是通過覈對數據的幀頭、幀尾,然後執行回調函數,幀中間內容是沒有做保存或處理的,如果就想使用網絡服務器來主動執行這部分回調函數,使用網絡服務器下發數據,通過esp8266傳給stm32去執行也是可以的。

二、配置URC

這裏只是舉個例子如何使用URC,重新連接服務器及後續的處理方式不要借鑑。
在這裏插入圖片描述

static void urc_closed_func(const char *data, rt_size_t size)
{
    LOG_D("與服務器斷開連接!");

    char str1[] = "AT+CIPSTART=\"TCP\",\"121.36.63.46\",10086\r\n";
    static rt_device_t serial;
    serial = rt_device_find("uart3");
    rt_device_write(serial, 0, "+++", 3);//向串口直接發送字符串,esp8266退出透傳模式

    rt_thread_mdelay(3000);
    LOG_D("正在嘗試重新連接服務器端口。。。");
    rt_device_write(serial, 0, str1, (sizeof(str1) - 1));
    rt_thread_mdelay(1000);
}
static void urc1_func(const char *data, rt_size_t size)
{
    LOG_D("測試數據1接收解析成功,可以執行1對應需求");
}
/*初始化解析接收數據的結構體,幀頭/幀尾/回調函數 */
static struct at_urc urc_table[] = {
    {"CLOSED",         "\r\n",     urc_closed_func},
    {"TEST111",        "\r\n",     urc1_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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章