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();
验证步骤
- 用Postman直接POST JSON数据到
http://你的服务器IP/sensordata/extractData.php,确认PHP能正常接收并存入数据库,排除后端问题。 - 打开Arduino串口监视器,查看ESP8266的AT指令响应,确认
AT+CIPSTART返回CONNECT OK,AT+CIPSEND返回>且发送成功。
内容的提问来源于stack exchange,提问作者intelligantnoob
相关产品推荐
相关产品推荐

