跳到主要内容

Arduino 数据序列化

在Arduino项目中,数据序列化是一个重要的概念。它允许我们将复杂的数据结构(如对象或数组)转换为一种可以轻松存储或传输的格式(如字符串或字节流)。序列化后的数据可以在需要时反序列化,恢复为原始数据结构。这对于存储数据到EEPROM、通过串口发送数据或与外部设备通信非常有用。

什么是数据序列化?

数据序列化是将数据结构或对象状态转换为可存储或传输的格式的过程。反序列化则是将序列化后的数据恢复为原始数据结构的过程。常见的序列化格式包括JSON、XML和二进制格式。

在Arduino中,由于资源有限,我们通常使用简单的序列化方法,如将数据转换为字符串或字节数组。

为什么需要数据序列化?

  1. 存储数据:将数据序列化后,可以将其存储在EEPROM或SD卡中。
  2. 传输数据:通过串口、Wi-Fi或蓝牙发送数据时,序列化可以简化数据传输。
  3. 跨平台兼容性:序列化后的数据可以在不同的设备或平台上使用。

简单的序列化示例

以下是一个简单的示例,展示了如何将整数和浮点数序列化为字符串,并通过串口发送。

cpp
void setup() {
Serial.begin(9600);

int sensorValue = 123;
float temperature = 25.5;

// 序列化数据
String serializedData = String(sensorValue) + "," + String(temperature);

// 发送序列化后的数据
Serial.println(serializedData);
}

void loop() {
// 空循环
}

输出:

123,25.50

在这个示例中,我们将传感器值和温度序列化为一个逗号分隔的字符串,并通过串口发送。接收方可以通过解析这个字符串来恢复原始数据。

反序列化示例

接下来,我们展示如何将接收到的序列化字符串反序列化为原始数据。

cpp
void setup() {
Serial.begin(9600);
}

void loop() {
if (Serial.available() > 0) {
String serializedData = Serial.readStringUntil('\n');

// 反序列化数据
int commaIndex = serializedData.indexOf(',');
int sensorValue = serializedData.substring(0, commaIndex).toInt();
float temperature = serializedData.substring(commaIndex + 1).toFloat();

// 打印反序列化后的数据
Serial.print("Sensor Value: ");
Serial.println(sensorValue);
Serial.print("Temperature: ");
Serial.println(temperature);
}
}

输入:

123,25.50

输出:

Sensor Value: 123
Temperature: 25.50

在这个示例中,我们从串口读取序列化后的字符串,并将其反序列化为整数和浮点数。

实际应用场景

场景1:存储传感器数据到EEPROM

假设你有一个温度传感器,每隔一段时间读取一次温度,并将其存储到EEPROM中。由于EEPROM的存储空间有限,我们可以将温度数据序列化为字节数组,然后存储。

cpp
#include <EEPROM.h>

void setup() {
Serial.begin(9600);

float temperature = 25.5;

// 序列化数据为字节数组
byte serializedData[sizeof(float)];
memcpy(serializedData, &temperature, sizeof(float));

// 存储到EEPROM
for (int i = 0; i < sizeof(float); i++) {
EEPROM.write(i, serializedData[i]);
}

// 从EEPROM读取并反序列化
float storedTemperature;
for (int i = 0; i < sizeof(float); i++) {
serializedData[i] = EEPROM.read(i);
}
memcpy(&storedTemperature, serializedData, sizeof(float));

Serial.print("Stored Temperature: ");
Serial.println(storedTemperature);
}

void loop() {
// 空循环
}

输出:

Stored Temperature: 25.50

场景2:通过Wi-Fi发送JSON数据

如果你使用ESP8266或ESP32等支持Wi-Fi的Arduino板,可以通过Wi-Fi将传感器数据发送到服务器。JSON是一种常用的序列化格式,适合跨平台通信。

cpp
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";

void setup() {
Serial.begin(9600);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}

int sensorValue = 123;
float temperature = 25.5;

// 创建JSON文档
StaticJsonDocument<200> jsonDoc;
jsonDoc["sensorValue"] = sensorValue;
jsonDoc["temperature"] = temperature;

// 序列化为JSON字符串
String jsonString;
serializeJson(jsonDoc, jsonString);

// 发送JSON数据
Serial.println("Sending JSON data: " + jsonString);
}

void loop() {
// 空循环
}

输出:

Sending JSON data: {"sensorValue":123,"temperature":25.5}

总结

数据序列化是Arduino项目中一个非常有用的技术,它允许我们以高效的方式存储和传输数据。通过将数据序列化为字符串或字节数组,我们可以轻松地在不同的设备或平台上共享数据。

提示

在实际项目中,选择适合的序列化格式非常重要。对于简单的数据,字符串序列化可能足够;而对于复杂的数据结构,JSON或二进制格式可能更合适。

附加资源与练习

  1. 练习1:尝试将多个传感器的数据序列化为JSON格式,并通过串口发送。
  2. 练习2:使用EEPROM存储多个传感器的数据,并在启动时读取并反序列化。
  3. 资源:了解更多关于JSON序列化的信息,可以访问ArduinoJson官方网站。

通过掌握数据序列化技术,你将能够更高效地处理Arduino项目中的数据存储和传输问题。