Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Arduino JSON over Serial,JSON.Parse返回意外的JSON输入_Javascript_Node.js_Json - Fatal编程技术网

Javascript Arduino JSON over Serial,JSON.Parse返回意外的JSON输入

Javascript Arduino JSON over Serial,JSON.Parse返回意外的JSON输入,javascript,node.js,json,Javascript,Node.js,Json,我正在构建一个简单的网页,通过JavaScript DOM操作更新数据。我想从Arduino接收数据,这是我在Arduino上使用serialize和在node.js中使用SerialPort完成的 我能够将串行数据记录为一个块,返回如下 { "day": "Friday", "temperature": 288, "humidity": 1099 } 根据我的研究,我想我需要解析我的Jso

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

我能够将串行数据记录为一个块,返回如下

{
    "day": "Friday",
    "temperature": 288,
    "humidity": 1099
}
根据我的研究,我想我需要解析我的Json对象,但我得到了一个

(节点:7759)未经处理的PromisejectionWarning: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);
});
阿杜伊诺代码

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();
  }
void setup(){
//将安装代码放在此处,以便运行一次:
Serial.begin(9600);
}
void循环(){
myFunction();
延迟(5000);
}
int myFunction(){
静态文件;
内部温度=288;
内部湿度=1099;
文件[“日”]=“星期五”;
doc[“温度”]=温度;
doc[“湿度”]=湿度;
SerializedJSonPretty(文档,序列);
Serial.println();
}

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

我将其切换为动态,如文档中所示

我的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();
  }
#包括
无效设置(){
//将安装代码放在此处,以便运行一次:
Serial.begin(9600);
}
void循环(){
myFunction();
延迟(5000);
}
int myFunction(){
文件文件(260);
内部温度=21;
内部湿度=99;
文件[“日”]=“星期一”;
doc[“温度”]=温度;
doc[“湿度”]=湿度;
序列化JSON(文档,串行);
Serial.println();
}

我认为只要解析器检测到换行符,就会调用parser.on(“data”,…)回调,而不是在解析器检测到JSON结束时调用。好吧,我做了一些更改,并遵循了您链接的示例,我仍然得到了JSON对象。但我仍然无法在单独的变量中包含day、temp、湿度,一旦我尝试执行数据。day返回了5个未定义的数据。在发送之前,您是否能够从json字符串中删除新行?然后,当您的readline解析器触发时,它可能会有整个json字符串,而不是第一行,这就是为什么它现在会中断的原因。目前,我还没有找到在发送它之前删除新行的方法。我的印象是分隔符会处理这个问题。我会继续找的,谢谢你给我指出了那个方向。也许试一下,而不是用漂亮?