2023-06-12
查缺补漏进步
00

前言

单片机使用过程中,经常使用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 = "";
  }
}
如果对你有用的话,可以打赏哦
打赏
logo ali pay
logo wechat pay