【问题标题】:Arduino JSON over Serial, Json.Parse returning Unexpected JSON inputArduino JSON over Serial,Json.Parse 返回意外的 JSON 输入
【发布时间】:2021-05-02 17:41:03
【问题描述】:

我正在构建一个简单的网页,该网页通过 JavaScript DOM 操作更新数据。我想从 Arduino 接收数据,我在 Arduino 上使用 serialize 并在 node.js 中使用 SerialPort。

我可以将来自串行的数据作为一个块进行控制台记录,返回如下。

{
    "day": "Friday",
    "temperature": 288,
    "humidity": 1099
}

根据我的研究,我认为我需要解析我的 Json 对象,但我得到了一个

(节点:7759)UnhandledPromiseRejectionWarning:SyntaxError:JSON.parse() 处的 JSON 输入意外结束 ....

我在这个主题上非常熟悉,任何帮助我指出正确方向的帮助都将非常感激。

节点 JS 代码

const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
const port = new SerialPort('/dev/cu.usbmodem14201', { baudRate: 9600 });
const parser = port.pipe(new Readline({ delimiter: '\r\n' }));// Read the port data

port.on("open", () => {
  console.log('serial port open');
});
parser.on('data', data =>{
  str = data.toString();
  str = JSON.stringify(data);
  str = JSON.parse(data);

  console.log(str.day);
});

Arduino 代码

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  myFunction();
  delay(5000);
}

int myFunction(){
   StaticJsonDocument<256> doc;
    int temp = 288;
    int humidity = 1099;
    
    doc["day"] = "Friday";
    doc["temperature"] = temp;
    doc["humidity"] = humidity;

    serializeJsonPretty(doc,Serial);
    Serial.println();
  }

【问题讨论】:

  • 我认为你的 parser.on("data",...) 回调会在解析器检测到换行符时被调用,而不是在解析器检测到 JSON 结尾时调用。见serialport.io/docs/api-parser-readline
  • 好吧,我做了一些更改并按照您链接的示例进行操作,我仍然得到 JSON 对象。但是我仍然无法在单独的变量中包含天、温度、湿度,一旦我尝试做 data.day 我得到 5 undefined 返回。
  • 你能在发送前从 json 字符串中删除新行吗?然后,当您的 readline 解析器触发时,它可能具有整个 json 字符串,而不是直到第一个新行,这就是它现在中断的原因。
  • 目前我还没有找到在发送之前删除新行的方法。我的印象是分隔符会处理这个问题。我会继续寻找,感谢您为我指明方向。
  • 也许试试serializeJson而不是serializeJsonPretty?

标签: javascript node.js json


【解决方案1】:

我修好了,谢谢大家指出我正确的方向。问题出在我的 Arduino 代码中。我使用的是静态 JSON,它没有给我一个压缩字符串。

我将其切换为动态,如 https://arduinojson.org/ 文档中所述。

我的 Arduino 变成了下面这个。

#include <ArduinoJson.h>

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  myFunction();
  delay(5000);
}

int myFunction(){
    DynamicJsonDocument doc(260);
    
    int temp = 21;
    int humidity = 99;
    
    doc["day"] = "Monday";
    doc["temperature"] = temp;
    doc["humidity"] = humidity;

    serializeJson(doc,Serial);
    Serial.println();
  }

【讨论】:

    猜你喜欢
    • 2021-06-23
    • 2018-05-01
    • 2020-11-18
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2016-11-13
    相关资源
    最近更新 更多