硬汉嵌入式论坛

 找回密码
 立即注册
查看: 940|回复: 1
收起左侧

[问题解答] H7-TOOL源码疑惑

[复制链接]

2

主题

0

回帖

6

积分

新手上路

积分
6
发表于 2022-2-11 15:29:06 | 显示全部楼层 |阅读模式
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: wifi_task
  4. *    功能说明: NB73任务,插入bsp_Idle()执行。!!!注意,此函数内部不得有 bsp_Idle调用,避免嵌套.
  5. *    形    参: 无
  6. *    返 回 值: 0:不满足条件  1:成功检测到字符串  2:超时了
  7. *********************************************************************************************************
  8. */
  9. uint8_t wifi_task(void)
  10. {
  11.     static int32_t s_last_time = 0;
  12.     char buf[64];
  13.     static uint8_t retry = 0;
  14.     uint16_t rx_len;
  15.     uint8_t re;

  16.     if (g_tVar.WiFiRecivedIPD == 1) /* 收到UDP. TCP数据包 */
  17.     {
  18.         g_tVar.WiFiRecivedIPD = 0;

  19.         wifi_led_rx_data(); /* 数据led闪一下 */

  20.         wifi_server_ack_ok = 1; /* 2019-01-17, 收到平台数据包, 简单处理,未做校验 */

  21.         return 1;
  22.     }

  23.     //    g_tVar.WiFiIdleDoRS485 = 1;        /* bsp_Idle 执行MODBUS RTU 485 */

  24.     switch (wifi_state)
  25.     {
  26.         case WIFI_STOP:
  27.             break;

  28.         case WIFI_INIT:
  29.             //            g_tVar.WiFiDebugEn  = 1;

  30.             wifi_led_joinap(); /* 连接AP过程,快闪 */

  31.             comSetBaud(COM_ESP32, 115200);
  32.             bsp_InitESP32(); /* 内部有 20ms 延迟 */
  33.             s_last_time = bsp_GetRunTime();
  34.             WIFI_CheckAck("", 0); /* 0参数表示初始化函数内部的静态变量 */
  35.             wifi_state++;
  36.             break;

  37.         case WIFI_INIT + 1:
  38.             re = WIFI_CheckAck("ready", 300);
  39.             if (re == 1)
  40.             {
  41.                 wifi_state++; /* 收到正确应答 */
  42.             }
  43.             else if (re == 2)
  44.             {
  45.                 wifi_state = WIFI_INIT; /* 超时 */
  46.             }
  47.             break;

  48.         case WIFI_INIT + 2:
  49.             /* 关闭回显功能,主机发送的字符,模块无需返回 */
  50.             ESP32_SendAT("ATE0");
  51.             ESP32_WaitResponse("OK\r\n", 100);

  52.             /* 获取MAC */
  53.             {
  54.                 uint8_t mac[6];
  55.                 const uint8_t mac_0[6] = {0, 0, 0, 0, 0, 0};

  56.                 ESP32_GetMac(mac);

  57.                 if (memcmp(mac, g_tParam.WiFiMac, 6) != 0 && memcmp(mac, mac_0, 6) != 0)
  58.                 {
  59.                     memcpy(g_tParam.WiFiMac, mac, 6);
  60.                     SaveParam();
  61.                 }
  62.             }

  63.             /* 根据参数决定是否扮演softAP */
  64.             if (g_tParam.APSelfEn == 1)
  65.             {
  66.                 wifi_state = WIFI_SOFT_AP;
  67.             }
  68.             else
  69.             {
  70.                 wifi_state = WIFI_LINK_AP;
  71.             }
  72.             break;

  73.         case WIFI_LINK_AP:
  74.             ESP32_SetWiFiMode(1); /* 1 = STA, 2 = SAP,  3 = SAP + Station模式 */

  75.             if (g_tParam.DHCPEn == 0) /* DHCH = 0, 使用静态IP */
  76.             {
  77.                 ESP32_SendAT("AT+CWDHCP_CUR=1,0");
  78.                 ESP32_WaitResponse("OK\r\n", 300);

  79.                 ESP32_SetLocalIP(g_tParam.WiFiIPAddr, g_tParam.WiFiNetMask, g_tParam.WiFiGateway); /* 设置静态IP */
  80.             }
  81.             else /* DHCH = 1, 使用动态IP */
  82.             {
  83.                 ESP32_SendAT("AT+CWDHCP_CUR=1,1");
  84.                 ESP32_WaitResponse("OK\r\n", 300);
  85.             }
  86.             wifi_led_joinap(); /* 连接wifi过程中快速闪烁 */
  87.             wifi_state++;
  88.             break;

  89.         case WIFI_LINK_AP + 1:
  90.             if (ESP32_ValidSSID((char *)g_tParam.AP_SSID) == 0 || ESP32_ValidPassword((char *)g_tParam.AP_PASS) == 0)
  91.             {
  92.                 wifi_state = WIFI_STOP; /* iFi SSID和密码参数异常 */
  93.                 break;
  94.             }

  95.             sprintf(buf, "AT+CWJAP_CUR="%s","%s"", g_tParam.AP_SSID, g_tParam.AP_PASS);
  96.             ESP32_SendAT(buf);
  97.             s_last_time = bsp_GetRunTime();
  98.             wifi_state++;
  99.             break;

  100.         case WIFI_LINK_AP + 2:
  101.             if (ESP32_ReadLineNoWait(buf, 64))
  102.             {
  103.                 if (memcmp(buf, "OK", 2) == 0)
  104.                 {
  105.                     wifi_state = WIFI_LINK_AP + 3; /* 连接AP OK */
  106.                 }
  107.                 else if (memcmp(buf, "WIFI CONNECTED", 14) == 0 || memcmp(buf, "WIFI GOT IP", 11) == 0)
  108.                 {
  109.                     ; /* 连接过程中,正常应答,不理会,继续等待最后的OK */
  110.                 }
  111.                 else if (memcmp(buf, "+CWJAP:", 7) == 0 || memcmp(buf, "FAIL", 4) == 0 || memcmp(buf, "DISCONNECT", 10) == 0)
  112.                 {
  113.                     wifi_state = WIFI_INIT; /* 连接失败 */
  114.                 }
  115.             }

  116.             if (bsp_CheckRunTime(s_last_time) > 20 * 1000) /* 超时 */
  117.             {
  118.                 wifi_state = WIFI_INIT;
  119.             }
  120.             break;

  121.         case WIFI_LINK_AP + 3:             /* 连接AP OK */
  122.             g_tVar.HomeWiFiLinkOk = 1; /* 已连接到HOME WIFI */
  123.             wifi_led_ok();                         /* LED熄灭 */

  124.             ESP32_CIPMUX(1); /* 启用多连接模式 */
  125.             //ESP32_CloseTcpUdp(LINK_ID_UDP_SERVER);

  126.             /* 创建TCP服务器. */
  127.             ESP32_CreateTCPServer(g_tParam.LocalTCPPort);

  128.             /* 创建UDP监听端口, id = 0 */
  129.             ESP32_CreateUDPServer(LINK_ID_UDP_SERVER, g_tParam.LocalTCPPort);

  130.             wifi_state = WIFI_READY;
  131.             break;

  132.         /*---------------------------------------------------------------------------*/
  133.         case WIFI_WATCH_DOG: /* WiFi看护 */
  134.             retry = 0;
  135.             wifi_state++;
  136.             break;

  137.         case WIFI_WATCH_DOG + 1: /* WiFi看护 */
  138.             wifi_link_tcp_ok = 0;
  139.             wifi_join_ap_ok = 0;
  140.             ESP32_SendAT("AT+CIPSTATUS");
  141.             s_last_time = bsp_GetRunTime();
  142.             wifi_state++;
  143.             break;

  144.         case WIFI_WATCH_DOG + 2:
  145.             while (1)
  146.             {
  147.                 rx_len = ESP32_ReadLineNoWait(buf, 64);
  148.                 if (rx_len == 0)
  149.                 {
  150.                     break;
  151.                 }
  152.                 else if (rx_len > 7 && memcmp(buf, "STATUS:", 7) == 0)
  153.                 {
  154.                     /*  STATUS:3 */
  155.                     if (buf[7] == '2' || buf[7] == '3' || buf[7] == '4')
  156.                     {
  157.                         wifi_join_ap_ok = 1; /* 连接AP ok */
  158.                     }
  159.                     else
  160.                     {
  161.                         if (g_tParam.APSelfEn == 1) /* 做SoftAP */
  162.                         {
  163.                             ; /* 不判断, 根据UDP状态判断 */
  164.                         }
  165.                         else /* 做STA站点 */
  166.                         {
  167.                             wifi_join_ap_ok = 0; /* 没有连接到AP */
  168.                         }
  169.                     }
  170.                 }
  171.                 else if (rx_len >= 18 && memcmp(buf, "+CIPSTATUS:0,"UDP"", 18) == 0)
  172.                 {
  173.                     if (g_tParam.APSelfEn == 1)
  174.                     {
  175.                         wifi_join_ap_ok = 1;
  176.                     }
  177.                 }
  178.                 else if (rx_len >= 18 && memcmp(buf, "+CIPSTATUS:4,"TCP"", 18) == 0)
  179.                 {
  180.                     /* +CIPSTATUS:4,"TCP","192.168.1.3",9800,37299,0 */
  181.                     wifi_link_tcp_ok = 1;
  182.                 }
  183.                 else if (rx_len >= 2 && memcmp(buf, "OK", 2) == 0)
  184.                 {
  185.                     if (wifi_join_ap_ok == 1)
  186.                     {
  187.                         wifi_state = WIFI_READY;
  188.                     }
  189.                     else
  190.                     {
  191.                         //wifi_state = WIFI_INIT; 不要立即改变状态,等3次查询失败后再走
  192.                     }
  193.                 }
  194.                 else if (rx_len >= 5 && memcmp(buf, "busy p...", 5) == 0) /* 内部忙 */
  195.                 {
  196.                     ;
  197.                 }
  198.             }

  199.             if (bsp_CheckRunTime(s_last_time) > 100) /* 超时 */
  200.             {
  201.                 if (++retry > 2)
  202.                 {
  203.                     if (wifi_join_ap_ok == 0)
  204.                     {
  205.                         wifi_state = WIFI_INIT; /* 复位WIFI模块,重连AP */
  206.                     }
  207.                     else
  208.                     {
  209.                         wifi_state = WIFI_READY; /* 应该进不来 */
  210.                     }
  211.                 }
  212.                 else
  213.                 {
  214.                     wifi_state--;
  215.                 }
  216.             }
  217.             break;

  218.         /*---------------------------------------------------------------------------*/
  219.         case WIFI_READY: /* wifi 就绪 */
  220.             wifi_Poll();
  221.             break;
  222.     }

  223.     return 0;
  224. }
复制代码
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: ESP32_WaitResponse
  4. *    功能说明: 等待ESP32返回指定的应答字符串, 可以包含任意字符。只要接收齐全即可返回。
  5. *    形    参: _pAckStr : 应答的字符串, 长度不得超过255. 支持检测多个字符串\t间隔.
  6. *             _usTimeOut : 命令执行超时,0表示一直等待. >0表示超时时间,单位1ms
  7. *    返 回 值: 1 表示成功  0 表示失败
  8. *********************************************************************************************************
  9. */
  10. uint8_t ESP32_WaitResponse(char *_pAckStr, uint16_t _usTimeOut)
  11. {
  12.     uint8_t ucData;
  13.     uint16_t pos = 0;
  14.     uint32_t len;
  15.     uint8_t ret;
  16.     int32_t time1;

  17.     len = strlen(_pAckStr);
  18.     if (len > 255)
  19.     {
  20.         return 0;
  21.     }

  22.     time1 = bsp_GetRunTime();
  23.     while (1)
  24.     {
  25.         bsp_Idle(); /* CPU空闲执行的操作, 见 bsp.c 和 bsp.h 文件 */

  26.         if (_usTimeOut > 0) /* _usTimeOut == 0 表示无限等待 */
  27.         {
  28.             if (bsp_CheckRunTime(time1) >= _usTimeOut)
  29.             {
  30.                 ret = 0; /* 超时 */
  31.                 break;
  32.             }
  33.         }

  34.         if (ESP32_GetChar(&ucData))
  35.         {

  36.             {
  37.                 if (ucData == _pAckStr[pos])
  38.                 {
  39.                     pos++;

  40.                     if (pos == len)
  41.                     {
  42.                         ret = 1; /* 收到指定的应答数据,返回成功 */
  43.                         break;
  44.                     }
  45.                 }
  46.                 else
  47.                 {
  48.                     pos = 0;
  49.                 }
  50.             }
  51.         }
  52.     }
  53.     return ret;
  54. }
复制代码
  1. void bsp_Idle(void)
  2. {
  3.     /* --- 喂狗 */

  4.     lwip_pro();             /* 以太网协议栈轮询 */

  5.     wifi_task();

  6.     lua_Poll();

  7.     EXIO_ScanTask();        /* 扩展IO任务 */

  8.     LCD_Task();                            /* 显示屏任务,硬件SPI+DMA+刷屏 */   

  9.     PC_CmdTask();           /* PC机控制任务 */

  10.     DelayOpenUSBTask();     /* 延迟启动USB */
  11. }
复制代码

就是 bsp_Idle 调用了 wifi_task ,
wifi_task 调用了  ESP32_WaitResponse,
ESP32_WaitResponse 又调用了 bsp_Idle,

这样没影响吗?  


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2022-2-11 15:58:26 | 显示全部楼层
不可以,这个是个bug,这个函数开头还特别注释了这个问题:

““NB73任务,插入bsp_Idle()执行。!!!注意,此函数内部不得有 bsp_Idle调用,避免嵌套.””

你看的V1.X的开源代码还没有添加WIFI功能,如果大家要用,仅供大家参考。

V2.X还未开源的代码了,重新做了实现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 12:22 , Processed in 0.249382 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表