|
|
本帖最后由 hpdell 于 2026-3-5 21:25 编辑
驱动 esp8266 发送数据只能发送一次成功,后面再发送数据就会提示失败是怎么回事呀 ?
// 发送 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);
}
}
|
|