前言
单片机使用过程中,经常使用json和上位机进行通信,json数据格式为最常用的方式之一,以下介绍一种最简单的单片机串口接收json字符串的实现过程。
c#include <ArduinoJson.h> int state = 0; boolean beginFlag = false; unsigned long lastReceiveTime = 0; // 记录上次接收到数据的时间 boolean stringComplete = false; // whether the string is complete String inputString = ""; // a String to hold incoming data StaticJsonDocument<200> doc; void setup() { // put your setup code here, to run once: Serial.begin(9600); while (!Serial); } void loop() { /* ************串口数据接收************* */ while (Serial.available()) { // get the new byte: char inChar = Serial.read(); lastReceiveTime = millis(); // 更新接收时间 if (inChar == '{' && beginFlag == 0) { beginFlag = true; } if (beginFlag == true) { if (inChar == '{') { state += 1; } else if (inChar == '}') { state -= 1; } inputString += inChar; if (state == 0) { beginFlag = false; stringComplete = true; } } } // 如果超过一定时间没有接收到完整数据,则重置状态 if (beginFlag && millis() - lastReceiveTime > 1000) { beginFlag = false; state = 0; inputString = ""; Serial.println("接收超时,重置状态"); } /* ************接收数据解析及处理************* */ if (stringComplete) { stringComplete = false; //Serial.println(inputString); DeserializationError error = deserializeJson(doc, inputString.c_str()); if (error) { Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); }else { // 如果解析成功,处理数据 // 示例:获取 JSON 中的某个字段 // const char* example = doc["key"]; // Serial.println(example); } // 清空输入字符串,准备接收下一个 JSON 对象 inputString = ""; } }