|
- /*
- *********************************************************************************************************
- * 函 数 名: wifi_task
- * 功能说明: NB73任务,插入bsp_Idle()执行。!!!注意,此函数内部不得有 bsp_Idle调用,避免嵌套.
- * 形 参: 无
- * 返 回 值: 0:不满足条件 1:成功检测到字符串 2:超时了
- *********************************************************************************************************
- */
- uint8_t wifi_task(void)
- {
- static int32_t s_last_time = 0;
- char buf[64];
- static uint8_t retry = 0;
- uint16_t rx_len;
- uint8_t re;
- if (g_tVar.WiFiRecivedIPD == 1) /* 收到UDP. TCP数据包 */
- {
- g_tVar.WiFiRecivedIPD = 0;
- wifi_led_rx_data(); /* 数据led闪一下 */
- wifi_server_ack_ok = 1; /* 2019-01-17, 收到平台数据包, 简单处理,未做校验 */
- return 1;
- }
- // g_tVar.WiFiIdleDoRS485 = 1; /* bsp_Idle 执行MODBUS RTU 485 */
- switch (wifi_state)
- {
- case WIFI_STOP:
- break;
- case WIFI_INIT:
- // g_tVar.WiFiDebugEn = 1;
- wifi_led_joinap(); /* 连接AP过程,快闪 */
- comSetBaud(COM_ESP32, 115200);
- bsp_InitESP32(); /* 内部有 20ms 延迟 */
- s_last_time = bsp_GetRunTime();
- WIFI_CheckAck("", 0); /* 0参数表示初始化函数内部的静态变量 */
- wifi_state++;
- break;
- case WIFI_INIT + 1:
- re = WIFI_CheckAck("ready", 300);
- if (re == 1)
- {
- wifi_state++; /* 收到正确应答 */
- }
- else if (re == 2)
- {
- wifi_state = WIFI_INIT; /* 超时 */
- }
- break;
- case WIFI_INIT + 2:
- /* 关闭回显功能,主机发送的字符,模块无需返回 */
- ESP32_SendAT("ATE0");
- ESP32_WaitResponse("OK\r\n", 100);
- /* 获取MAC */
- {
- uint8_t mac[6];
- const uint8_t mac_0[6] = {0, 0, 0, 0, 0, 0};
- ESP32_GetMac(mac);
- if (memcmp(mac, g_tParam.WiFiMac, 6) != 0 && memcmp(mac, mac_0, 6) != 0)
- {
- memcpy(g_tParam.WiFiMac, mac, 6);
- SaveParam();
- }
- }
- /* 根据参数决定是否扮演softAP */
- if (g_tParam.APSelfEn == 1)
- {
- wifi_state = WIFI_SOFT_AP;
- }
- else
- {
- wifi_state = WIFI_LINK_AP;
- }
- break;
- case WIFI_LINK_AP:
- ESP32_SetWiFiMode(1); /* 1 = STA, 2 = SAP, 3 = SAP + Station模式 */
- if (g_tParam.DHCPEn == 0) /* DHCH = 0, 使用静态IP */
- {
- ESP32_SendAT("AT+CWDHCP_CUR=1,0");
- ESP32_WaitResponse("OK\r\n", 300);
- ESP32_SetLocalIP(g_tParam.WiFiIPAddr, g_tParam.WiFiNetMask, g_tParam.WiFiGateway); /* 设置静态IP */
- }
- else /* DHCH = 1, 使用动态IP */
- {
- ESP32_SendAT("AT+CWDHCP_CUR=1,1");
- ESP32_WaitResponse("OK\r\n", 300);
- }
- wifi_led_joinap(); /* 连接wifi过程中快速闪烁 */
- wifi_state++;
- break;
- case WIFI_LINK_AP + 1:
- if (ESP32_ValidSSID((char *)g_tParam.AP_SSID) == 0 || ESP32_ValidPassword((char *)g_tParam.AP_PASS) == 0)
- {
- wifi_state = WIFI_STOP; /* iFi SSID和密码参数异常 */
- break;
- }
- sprintf(buf, "AT+CWJAP_CUR="%s","%s"", g_tParam.AP_SSID, g_tParam.AP_PASS);
- ESP32_SendAT(buf);
- s_last_time = bsp_GetRunTime();
- wifi_state++;
- break;
- case WIFI_LINK_AP + 2:
- if (ESP32_ReadLineNoWait(buf, 64))
- {
- if (memcmp(buf, "OK", 2) == 0)
- {
- wifi_state = WIFI_LINK_AP + 3; /* 连接AP OK */
- }
- else if (memcmp(buf, "WIFI CONNECTED", 14) == 0 || memcmp(buf, "WIFI GOT IP", 11) == 0)
- {
- ; /* 连接过程中,正常应答,不理会,继续等待最后的OK */
- }
- else if (memcmp(buf, "+CWJAP:", 7) == 0 || memcmp(buf, "FAIL", 4) == 0 || memcmp(buf, "DISCONNECT", 10) == 0)
- {
- wifi_state = WIFI_INIT; /* 连接失败 */
- }
- }
- if (bsp_CheckRunTime(s_last_time) > 20 * 1000) /* 超时 */
- {
- wifi_state = WIFI_INIT;
- }
- break;
- case WIFI_LINK_AP + 3: /* 连接AP OK */
- g_tVar.HomeWiFiLinkOk = 1; /* 已连接到HOME WIFI */
- wifi_led_ok(); /* LED熄灭 */
- ESP32_CIPMUX(1); /* 启用多连接模式 */
- //ESP32_CloseTcpUdp(LINK_ID_UDP_SERVER);
- /* 创建TCP服务器. */
- ESP32_CreateTCPServer(g_tParam.LocalTCPPort);
- /* 创建UDP监听端口, id = 0 */
- ESP32_CreateUDPServer(LINK_ID_UDP_SERVER, g_tParam.LocalTCPPort);
- wifi_state = WIFI_READY;
- break;
- /*---------------------------------------------------------------------------*/
- case WIFI_WATCH_DOG: /* WiFi看护 */
- retry = 0;
- wifi_state++;
- break;
- case WIFI_WATCH_DOG + 1: /* WiFi看护 */
- wifi_link_tcp_ok = 0;
- wifi_join_ap_ok = 0;
- ESP32_SendAT("AT+CIPSTATUS");
- s_last_time = bsp_GetRunTime();
- wifi_state++;
- break;
- case WIFI_WATCH_DOG + 2:
- while (1)
- {
- rx_len = ESP32_ReadLineNoWait(buf, 64);
- if (rx_len == 0)
- {
- break;
- }
- else if (rx_len > 7 && memcmp(buf, "STATUS:", 7) == 0)
- {
- /* STATUS:3 */
- if (buf[7] == '2' || buf[7] == '3' || buf[7] == '4')
- {
- wifi_join_ap_ok = 1; /* 连接AP ok */
- }
- else
- {
- if (g_tParam.APSelfEn == 1) /* 做SoftAP */
- {
- ; /* 不判断, 根据UDP状态判断 */
- }
- else /* 做STA站点 */
- {
- wifi_join_ap_ok = 0; /* 没有连接到AP */
- }
- }
- }
- else if (rx_len >= 18 && memcmp(buf, "+CIPSTATUS:0,"UDP"", 18) == 0)
- {
- if (g_tParam.APSelfEn == 1)
- {
- wifi_join_ap_ok = 1;
- }
- }
- else if (rx_len >= 18 && memcmp(buf, "+CIPSTATUS:4,"TCP"", 18) == 0)
- {
- /* +CIPSTATUS:4,"TCP","192.168.1.3",9800,37299,0 */
- wifi_link_tcp_ok = 1;
- }
- else if (rx_len >= 2 && memcmp(buf, "OK", 2) == 0)
- {
- if (wifi_join_ap_ok == 1)
- {
- wifi_state = WIFI_READY;
- }
- else
- {
- //wifi_state = WIFI_INIT; 不要立即改变状态,等3次查询失败后再走
- }
- }
- else if (rx_len >= 5 && memcmp(buf, "busy p...", 5) == 0) /* 内部忙 */
- {
- ;
- }
- }
- if (bsp_CheckRunTime(s_last_time) > 100) /* 超时 */
- {
- if (++retry > 2)
- {
- if (wifi_join_ap_ok == 0)
- {
- wifi_state = WIFI_INIT; /* 复位WIFI模块,重连AP */
- }
- else
- {
- wifi_state = WIFI_READY; /* 应该进不来 */
- }
- }
- else
- {
- wifi_state--;
- }
- }
- break;
- /*---------------------------------------------------------------------------*/
- case WIFI_READY: /* wifi 就绪 */
- wifi_Poll();
- break;
- }
- return 0;
- }
复制代码- /*
- *********************************************************************************************************
- * 函 数 名: ESP32_WaitResponse
- * 功能说明: 等待ESP32返回指定的应答字符串, 可以包含任意字符。只要接收齐全即可返回。
- * 形 参: _pAckStr : 应答的字符串, 长度不得超过255. 支持检测多个字符串\t间隔.
- * _usTimeOut : 命令执行超时,0表示一直等待. >0表示超时时间,单位1ms
- * 返 回 值: 1 表示成功 0 表示失败
- *********************************************************************************************************
- */
- uint8_t ESP32_WaitResponse(char *_pAckStr, uint16_t _usTimeOut)
- {
- uint8_t ucData;
- uint16_t pos = 0;
- uint32_t len;
- uint8_t ret;
- int32_t time1;
- len = strlen(_pAckStr);
- if (len > 255)
- {
- return 0;
- }
- time1 = bsp_GetRunTime();
- while (1)
- {
- bsp_Idle(); /* CPU空闲执行的操作, 见 bsp.c 和 bsp.h 文件 */
- if (_usTimeOut > 0) /* _usTimeOut == 0 表示无限等待 */
- {
- if (bsp_CheckRunTime(time1) >= _usTimeOut)
- {
- ret = 0; /* 超时 */
- break;
- }
- }
- if (ESP32_GetChar(&ucData))
- {
- {
- if (ucData == _pAckStr[pos])
- {
- pos++;
- if (pos == len)
- {
- ret = 1; /* 收到指定的应答数据,返回成功 */
- break;
- }
- }
- else
- {
- pos = 0;
- }
- }
- }
- }
- return ret;
- }
复制代码- void bsp_Idle(void)
- {
- /* --- 喂狗 */
- lwip_pro(); /* 以太网协议栈轮询 */
- wifi_task();
- lua_Poll();
- EXIO_ScanTask(); /* 扩展IO任务 */
- LCD_Task(); /* 显示屏任务,硬件SPI+DMA+刷屏 */
- PC_CmdTask(); /* PC机控制任务 */
- DelayOpenUSBTask(); /* 延迟启动USB */
- }
复制代码
就是 bsp_Idle 调用了 wifi_task ,
wifi_task 调用了 ESP32_WaitResponse,
ESP32_WaitResponse 又调用了 bsp_Idle,
这样没影响吗?
|
|