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

使用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应保持极简,避免涉及串口通信、延迟等操作。

修复方案:

  1. 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;
}
  1. 在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.json
  • http://sms-ileo.atwebpages.com/你的PHP脚本名称.php

若无法访问或返回错误,需先排查服务器端配置(如文件权限、路径是否正确)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 03:58:09