使用SIM7600CE从AwardSpace服务器向Arduino MEGA2560取数失败
问题排查与修复方案
以下是针对SIM7600CE模块无法从服务器获取数据问题的具体排查步骤和修复方案:
1. 核心缺失:TCP连接未建立
你的getdatafromserver函数直接发送HTTP请求,但未先建立与服务器的TCP连接,这是请求失败的核心原因之一。
修复代码:
在getdatafromserver函数开头添加连接逻辑:
void getdatafromserver(void){ // 先建立TCP连接 if (!client.connect(server, port)) { SerialMon.println(F("无法连接到服务器")); return; } // 原有的HTTP请求代码... }
2. HTTP响应头判断错误
HTTP协议中,响应头与正文的分隔符是\r\n\r\n(两个回车换行),你代码中使用纯换行符会导致无法正确识别正文起始位置。
修复代码:
// 替换原有的endOfHeaders定义 char endOfHeaders[] = "\r\n\r\n"; if (!client.find(endOfHeaders)) { SerialMon.println(F("响应格式无效")); client.stop(); return; }
3. JSON格式不兼容
- PHP脚本返回的是JSON数组(例如
[{"humidity": 60}]),但Arduino代码尝试解析JSON对象的sensor等字段,两者格式不匹配。 - 若使用PHP脚本获取数据,需修改Arduino解析逻辑;若用
test.json测试,需确保文件内容为标准JSON对象。
针对PHP脚本的解析修改:
// 解析JSON数组 DeserializationError error = deserializeJson(doc, client); if (error) { SerialMon.print(F("JSON解析失败: ")); SerialMon.println(error.f_str()); client.stop(); return; } // 提取数组中第一个元素的humidity值 SerialMon.println(F("服务器返回数据:")); SerialMon.print("湿度: "); SerialMon.println(doc[0]["humidity"].as<float>());
针对PHP脚本的输出优化(可选):
若希望PHP返回单个JSON对象而非数组,修改PHP代码:
// 替换原有的while循环和$data数组赋值 if ($row = $result->fetch(PDO::FETCH_ASSOC)) { $json_data = json_encode($row); echo $json_data; } else { echo '{"humidity": null}'; }
4. 定时器中断的安全问题
在定时器ISR中直接调用sendDataTempServeur和getdatafromserver这类复杂网络函数会导致系统不稳定——ISR应保持极简,避免涉及串口通信、延迟等操作。
修复方案:
- ISR中仅设置标志位:
ISR (TIMER3_OVF_vect) { nbCycleTimer3_g = nbCycleTimer3_g + 1; if(nbCycleTimer3_g == nbCycleGsm_g ) { timerGsm_g = 1; // 设置标志位 nbCycleTimer3_g = 0; } else if(nbCycleTimer3_g > nbCycleGsm_g) { nbCycleTimer3_g = 0; } TCNT3H = 0x00; TCNT3L = 0x00; }
- 在
loop主循环中检查标志位并执行操作:
void loop() { // 原有的网络初始化代码... timerGsm_go(30); while(1) { if(timerGsm_g) { sendDataTempServeur(); getdatafromserver(); timerGsm_g = 0; // 重置标志位 } } }
5. 调试增强:打印完整服务器响应
为快速定位问题,建议在跳过响应头后打印服务器返回的所有内容:
// 跳过HTTP headers后添加 SerialMon.println(F("服务器返回内容:")); while (client.available()) { char c = client.read(); SerialMon.print(c); } SerialMon.println();
6. 服务器端验证
先通过浏览器或命令行工具(如curl)访问以下地址,确认返回正确的JSON:
http://sms-ileo.atwebpages.com/test.jsonhttp://sms-ileo.atwebpages.com/你的PHP脚本名称.php
若无法访问或返回错误,需先排查服务器端配置(如文件权限、路径是否正确)。
内容的提问来源于stack exchange,提问作者All44000
相关产品推荐
相关产品推荐

