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

Arduino项目中timestamp可串口打印但无法存入StaticJsonDocument问题

Arduino项目中Timestamp无法写入StaticJsonDocument的问题

问题背景

我正在开发一个Arduino项目,以下是核心方法的代码片段,需重点关注String timestamp参数:

HttpUpstreamClient类的sendAlarmDeviceId方法

void HttpUpstreamClient::sendAlarmDeviceId(char* alarmType, char* alarmText, char* severity, String timestamp,char* URL, String deviceID ){

Serial.print("The alarm is sent to the device: ");
Serial.println(deviceID);
Serial.println(timestamp);

StaticJsonDocument<100> root;
JsonObject source  = root.createNestedObject("source");
source["id"] = deviceID;
root["type"] = alarmType;
root["text"] = alarmText;
root["severity"] = severity;  
root["time"] = timestamp;

String body2send= "";
serializeJsonPretty(root, body2send);
Serial.println(body2send);

if(_networkClient->connect(URL,443)){

Serial.println("Connected to server");

_networkClient->println("POST /alarm/alarms HTTP/1.1");  
_networkClient->print("Host: ");
_networkClient->println(URL);
_networkClient->print("Authorization: Basic ");
_networkClient->println(_base64);
_networkClient->println("Content-Type: application/json");
_networkClient->print("Content-Length: ");
_networkClient->println(body2send.length());
_networkClient->println("Accept: application/json");
_networkClient->println();
//client.println("Connection: close");
_networkClient->println(body2send);

}    

}

main.ino中的loop()函数片段

void loop() {
 // put your main code here, to run repeatedly:

 // from the server, read them and print them: 
  while (nwc.available()) {
  char c = nwc.read();
  //Serial.print(c);        
  }

timeClient.update();

delay(1000);

clienttest.sendAlarmDeviceId(alarm_Type, alarm_Text,Severity,timeClient.getFormattedDate(),URL,"2556130");

}

当前异常现象

Serial.println(timestamp);可以正常输出时间戳内容,但将timestamp赋值给StaticJsonDocument<100> root的time字段后,该字段在序列化后的JSON中不生效(要么缺失,要么值为空)。

排查与解决方案

  • 增大StaticJsonDocument容量:当前定义的StaticJsonDocument<100>容量过小,无法容纳完整的JSON结构(包括嵌套的source对象和较长的时间戳字符串)。建议将容量调整为StaticJsonDocument<256>或更大:
    StaticJsonDocument<256> root;
    
  • 改用C风格字符串赋值:尝试将String类型的timestamp转换为C风格字符串后赋值,避免String类型的潜在兼容问题:
    root["time"] = timestamp.c_str();
    
  • 检查序列化前的Document状态:在serializeJsonPretty前添加串口打印,直接输出Document内容,确认赋值是否成功:
    serializeJson(root, Serial); // 直接打印Document的原始JSON
    
  • 确认时间戳字符串格式:验证timeClient.getFormattedDate()返回的字符串是否包含特殊字符或过长内容,导致无法被ArduinoJson正常处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:30:56