硬汉嵌入式论坛

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

[STM32H7] 驱动 esp8266 发送数据只能发送一次成功,后面再发送数据就会提示失败是怎么回事呀 ?

[复制链接]

728

主题

3818

回帖

6027

积分

论坛元老

自定义头衔

积分
6027
发表于 昨天 21:09 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2026-3-5 21:25 编辑



驱动 esp8266 发送数据只能发送一次成功,后面再发送数据就会提示失败是怎么回事呀 ?

bsp_esp8266_LinkTcpServer_demo mcu 客户端发送数据只能发送一次是成功OK的 ??.png


        // 发送 ESP:AT+ATCIPSEND   数据

        if(esp_info.status  == AT_RESP_ALREADY_CONNECTED) {
               
                switch(esp_info.send_step) {
               
                        //透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
                        case 1: {
                               
                                if(!esp_info.delay_wait)  {
                                        char buf[64] = {0};
                                        esp_info.TCPServerOk = 2;
                                        sprintf(buf, "AT+CIPSEND\r\n");
                                        comSendBuf( (uint8_t *)buf, strlen(buf));
                                       
                                        esp_info.send_step  = 2;
                                        esp_info.delay_wait = 100;
                                }
                                break;
                        }
                       
                       
                        case 2: {
                       
                                if(!esp_info.delay_wait)  {
                                        /*
                                                AT+CIPSEND

                                                OK

                                                >        出现这个表示可以发送数据了哟 2026.03.05
                                        */
                                        static const char ackOKK[] = {">\0"};                // "OK\r\n\r\n>"
                                        uint8_t ucData;
                                       
                                        len = strlen(ackOKK);
                                        uint16_t _usTimeOut = ESP8266_UART_RX_TIMEOUT_S(6);
                                        /* _usTimeOut == 0 表示无限等待 */
                                        if (_usTimeOut > 0) {
                                                bsp_StartTimer(ESP8266_TMR_ID, _usTimeOut);                /* 使用软件定时器3,作为超时控制 */
                                        }
                                       
                                        while(1) {
                                                if (_usTimeOut > 0) {
                                                        if (bsp_CheckTimer(ESP8266_TMR_ID)) {
                                                                ret = 0;        /* 超时 */
                                                                esp_info.delay_wait  = 1000;
                                                                esp_info.send_step = AT_RESP_ACK_ERROR;           // 表示错误退出即可
                                                                esp_log("\r\n\0");
                                                               
                                                                esp_log("ESP8266 CIPSEND 应答错误 ?\r\n\0");
                                                                __LCD_drv->_ClrScr(CL_BLUE);
                                                                lcd_set_font(&FONT_USER_CN16_NONE);       
                                                                lcd_disp_str_at_pubic(10, 20,
                                                                                CL_WHITE, CL_BLUE,
                                                                                2, 2,
                                                                                (const char *)"ESP8266 CIPSEND 应答错误 ?\0");
                                                                break;
                                                        }
                                                }
                                               
                                                if (comGetChar( &ucData)) {
                                                        if(ucData != '\0') {
                                                                ESP8266_PrintRxData(ucData);                /* 将接收到数据打印到调试串口1 */
                                                               
                                                                if(i<ESP_BUFF_SIZE)  {
                                                                        esp_info.data = ucData;
                                                                }
                                                                i++;
                                                               
                                                                if (ucData == ackOKK[pos]) {
                                                                        pos++;
                                                                        if (pos == len) {
                                                                                bsp_StopTimer(ESP8266_TMR_ID);
                                                                                ret = 1;        /* 收到指定的应答数据,返回成功 */
                                                                                esp_info.send_step   = 3;
                                                                                esp_info.delay_wait  = 2000;
                                                                                esp_info.data = 0;
                                                                                esp_log("\r\n\0");
                                                                                break;                // 退出 while(1) 循环
                                                                        }
                                                                }
                                                                else {
                                                                        pos = 0;
                                                                }
                                                        }
                                                }
                                        }

                                        if(ret)  {
                                                ret = 0;
                                                // 显示在 lcd 显示屏上
                                                int  x = 0, y =2;
                                                int  x_pos = 2, y_pos =2;
                                                __LCD_drv->_ClrScr(CL_BLUE);
                                                lcd_set_font(&FONT_USER_CN16_NONE);       
                                                lcd_disp_str_at_pubic(x, y,
                                                                CL_WHITE, CL_BLUE,
                                                                x_pos, y_pos,
                                                                (const char *)esp_info.data);
                                        }
                                }
                                break;
                        }
                       
                       
                        case 3: {
                                if(!esp_info.delay_wait)  {
                                        // 发送测试数据到远程 服务端端
                                        // 这个 ip 与端口必须与 CIPSTART 这个指令设置的保持绝对一致哟(也就是远程 服务端默认的 ip 地址, 端口设置必须保持与 mcu 端 客户端的 端口一致即可) 2026.03.05
                                        //esp8266_send_data("GET http://192.168.43.95:80/esp8266/ ... 6&content=t_sum", 500);
                                        //esp8266_send_data1("GET http://192.168.43.95:80/esp8266/ ... %BA%A6&content=", t_sum, 500);
                                        static const char testWwwTest[]  = {"GET http://192.168.1.3:1001/esp8266/mcu.php?title=tem&content=\0"};
                                        static const char testDataTest[] = {"esp8266-clien-send-to-server-test.data\0"};
                                        esp_info.delay_wait  = 100;
                                        esp_info.send_step   = 4;        // 准备发送数据
                                        esp_info.TCPServerOk = 2;
                                       
                                        esp_info.send_len = strlen(testWwwTest);
                                        comSendBuf( (uint8_t *)testWwwTest, esp_info.send_len);        // 先发送网址
                                       
                                        esp_info.send_len = strlen((char *)testDataTest);
                                        comSendBuf( (uint8_t *)testDataTest, esp_info.send_len);        // 后发送数据
                                }
                                break;
                        }
                       
                       
                        case 4: {
                       
                                if(!esp_info.delay_wait)  {
                                       
                                        // 透传模式发送数据后没有应答信息返回哟,切记切记
                                        ret = 1;        /* 收到指定的应答数据,返回成功 */
                                        esp_info.send_step   += AT_RESP_UNKNOWN;
                                        esp_info.delay_wait  = 1000;
                                        esp_info.TCPServerOk = 10;                // 接收数据状态
                                }
                                break;
                        }
                       
                       
                        default:
                               
                        break;
                }
        }
       
       
        // 接收 远程 服务端返回的数据 , 貌似有点不太行 哈 ... ?
        if(esp_info.TCPServerOk == 10)  {
                esp_info.cmd_len = ESP8266_RxNew(esp_info.data, &esp_info.tcpid);
                if(esp_info.cmd_len >0)  {
                        esp_log("\r\n接收到数据长度 = %d\r\n远程ID =%d\r\n数据内容=%s\r\n", esp_info.cmd_len, esp_info.tcpid, esp_info.data);
                        __LCD_drv->_ClrScr(CL_BLUE);
                        lcd_set_font(&FONT_USER_CN16_NONE);       
                        esp_info.data[esp_info.cmd_len] = 0;
                        lcd_disp_str_at_pubic(10, 20,
                                        CL_WHITE, CL_BLUE,
                                        2, 2,
                                        (const char *)esp_info.data);
                }
        }





回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
121322
QQ
发表于 5 小时前 | 显示全部楼层
找个串口线直接对接你的模组,发送串口AT指令控制,看看正常不
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-6 06:35 , Processed in 0.548697 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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