You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino Uno+ESP8266通过AT指令上传JSON至MySQL失败求助

Arduino Uno + ESP8266 数据上传MySQL问题排查与修复

问题概述

通过Arduino Uno采集传感器数据,经ESP8266用AT指令POST到PHP后端存入MySQL,但PHP无法接收JSON数据;同时ESP8266用9600波特率无法连WiFi,疑问是否需要和Arduino统一波特率。


一、波特率问题解答

  • Arduino与ESP8266的串口通讯波特率必须完全一致,否则会出现乱码、指令无响应问题。
  • 多数ESP8266模块出厂默认波特率为115200,你当前代码里ESP8266.begin(115200)是合理的;如果要改成9600,需先通过AT指令AT+UART_DEF=9600,8,1,0,0设置ESP8266默认波特率并重启,再同步修改Arduino代码中的ESP8266.begin(9600)。

二、POST请求核心修复(确保PHP接收JSON)

1. 修正AT+CIPSEND长度计算

你当前用jsonPayload.length() + 150估算请求长度,容易导致发送失败,必须精确计算HTTP请求总长度:

String httpRequest = "POST /sensordata/extractData.php HTTP/1.1\r\n";
httpRequest += "Host: 192.168.4.33\r\n"; // 替换为你的服务器实际IP,不能用占位符
httpRequest += "Connection: close\r\n"; // 用close替代keep-alive,避免连接残留
httpRequest += "Content-Type: application/json\r\n";
httpRequest += "Content-Length: ";
httpRequest += jsonPayload.length();
httpRequest += "\r\n\r\n";
httpRequest += jsonPayload;

// 精确计算总长度后发送CIPSEND指令
ESP8266.print("AT+CIPSEND=");
ESP8266.println(httpRequest.length());
delay(delayTime);

2. 等待ESP8266的READY响应

发送AT+CIPSEND后,必须等待模块返回>(就绪标识)再发送HTTP请求,否则指令会失效:

ESP8266.print("AT+CIPSEND=");
ESP8266.println(httpRequest.length());
// 等待READY响应
while (!ESP8266.available());
String resp = ESP8266.readStringUntil('\n');
if (resp.indexOf(">") == -1) {
    Serial.println("CIPSEND failed");
    ESP8266.println("AT+CIPCLOSE");
    return;
}
// 发送完整HTTP请求
ESP8266.print(httpRequest);

3. 增强串口调试

添加ESP8266响应打印,方便定位指令错误:

// 封装AT指令发送与响应打印函数
void sendATCommand(String cmd) {
    ESP8266.println(cmd);
    delay(delayTime);
    while (ESP8266.available()) {
        Serial.println(ESP8266.readStringUntil('\n'));
    }
}
// 替换原代码中直接发送AT指令的语句,例如:
sendATCommand("AT+CIPSTART=\"TCP\",\"192.168.4.33\",80");

三、PHP代码优化

1. 修复JSON内容打印错误

原代码中echo "Received JSON Data: " . $data . "<br>";会将数组直接转为Array字符串,改为:

$rawData = file_get_contents('php://input');
echo "Received Raw Data: " . $rawData . "<br>";
$data = json_decode($rawData, true);

这样可以查看原始请求内容,快速判断是否为JSON格式问题。

2. 避免SQL注入风险

原代码直接拼接SQL语句存在安全隐患,改用预处理语句:

$sql = "INSERT INTO sensordatatable (sensor1Val) VALUES (?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $sensor1Val); // i表示整数类型,匹配传感器数据类型
if ($stmt->execute() === TRUE) {
    echo "New record successfully created";
} else {
    echo "Error: " . $stmt->error;
}
$stmt->close();

验证步骤

  1. 用Postman直接POST JSON数据到http://你的服务器IP/sensordata/extractData.php,确认PHP能正常接收并存入数据库,排除后端问题。
  2. 打开Arduino串口监视器,查看ESP8266的AT指令响应,确认AT+CIPSTART返回CONNECT OK,AT+CIPSEND返回>且发送成功。

内容的提问来源于stack exchange,提问作者intelligantnoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:05:58