我在使用 serial.read() 命令读取一些数据时遇到问题

I am have a problem reading some data using the serial.read() command

我定期从温室隧道中的 DHT22 传感器读取温度和湿度值。

传感器连接到 Arduino Pro Mini。 Pro Mini 还连接了一个 nF24l01 收发器,读数会传输到我办公室的另一个 nF24L01/Arduino Pro Mini。

Arduino通过USB串口线连接到台式电脑

目的是将接收到的温度和湿度读数写入 CSV 格式的文件。

我正在通过无线电 link 接收所有数据,这些数据又通过我的 USB 端口传送到我的电脑。我 运行ning Node 有一个名为 index.js.

的文件

下面是Arduino连接PC的代码。它是收音机的接收方 link.

[code]
/*
   See documentation at https://nRF24.github.io/RF24
   See License information at root directory of this library
   Author: Brendan Doherty (2bndy5)
*/

/**
   A simple example of sending data from 1 nRF24L01 transceiver to another.
  String message = "";
   This example was written to be used on 2 devices acting as "nodes".
   Use the Serial Monitor to change each node's behavior.
*/
#include <SPI.h>
#include <printf.h>
#include <nRF24L01.h>
#include <RF24.h>

struct dataStruct {
  float HumH;
  float TempC;
} myData;

bool newData = false;

RF24 radio(9, 10); // using pin 7 for the CE pin, andradio.read(&data, sizeof(MyData)); pin 8 for the CSN pin

uint8_t address[][6] = {"1Node", "2Node"};

bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit

bool role = false;  // true = TX role, false = RX role

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

  if (!radio.begin()) {
    Serial.println(F("radio hardware is not responding!!"));
    while (1) {} // hold in infinite loop
  }

  radio.setPALevel(RF24_PA_HIGH);                  // RF24_PA_MAX is default.
  radio.setPayloadSize(sizeof(dataStruct));           // float datatype occupies 4 bytes
  radio.openWritingPipe(address[radioNumber]);     // always uses pipe 0
  radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1
  radio.startListening(); // put radio in RX mode

  // For debugging info
  printf_begin();             // needed only once for printing details
  radio.printDetails();       // (smaller) function that prints raw register values
  radio.printPrettyDetails(); // (larger) function that prints human readable data

} // end of setup

void getData() {

  if (radio.available()) {

    //Serial.println("Radio is available******");

    radio.read(&myData, sizeof(dataStruct));
    newData = true;
  }
  //Serial.println("Radio is NOT available******");
}

void showData() {
  if (newData == true) {
    String message = "";
    message = message + "{\"humidity\": ";
    message = message + myData.HumH;
    message = message + ", \"temperature\": ";
    message = message + myData.TempC;
    message = message + "}";
    
    Serial.println(message);
    newData = false;
  }
}

void loop() {

  getData();
  showData();
}
[/code]

下面是连接到我的 PC 的 Arduino Pro Mini 串行输出的屏幕截图,显示了从温室接收到的内容以及发送到 PC 的内容。

Arduino Serial port screen shot

index2.js代码如下

const SerialPort = require('serialport');
//const Readline = new SerialPort.parsers.Readline('\n');
const port = new SerialPort('/dev/ttyUSB0', {
    baudRate: 115200
});

const fs = require('fs');
const { endianness } = require('os');
const { exit } = require('process');
const { Console } = require('console');

//const logIntervalMinutes = 1;
let lastMoment = new Date();

function tryParseJson(str) {
    try {
        JSON.parse(str);

    } catch (e) {
        
        console.log("JSON error")
        return false;
    }
    return JSON.parse(str);
}

console.log('Initialising...');

port.on('open', function () {

    console.log('Opened port...');
    port.on('data', function (data) {

        const sensorData = tryParseJson(data);

        console.log('Data:  ' + data);
        const moment = new Date();

        fs.appendFile('log.txt', `\n${sensorData.temperature} , ${sensorData.humidity} , ${moment}`, function (err) {
            if (err) {
                console.log('Your Jason has failed to get a complete string...');
            } else {
                console.log('Logged data: ', moment);
            };
        });
    });
});

当我 运行 node index2.js 并查看 log.txt 文件时,我发现有时 temp/Hum 值是列为 undefined,如下面的屏幕截图所示。

log.txt

经过一些调试后,我在 console.log() 中看到以下内容,如下面的屏幕截图所示。

Console.log() screen shot with program running.

所以我的问题是,有时 fs.append 无法确定 sensorData.temperature 和 sensorData.humidity 的值。 fs.append 仍将记录附加到 log.txt 文件,但前两个字段中有 undefined

    fs.appendFile('log.txt', `\n${sensorData.temperature} , ${sensorData.humidity} , ${moment}`, function (err) {
            if (err) {
                console.log('Your Jason has failed to get a complete string...');
            } else {
                console.log('Logged data: ', moment);
            };
        });

似乎 函数 tryParseJson(str) 有时只获取部分数据而不是完整的 JSON 对象。请参阅下面的代码,

function tryParseJson(str) {
    try {
        JSON.parse(str);

    } catch (e) {
        
        console.log("JSON error")
        return false;
    }
    return JSON.parse(str);

我看到 catch (e) 被调用了,我的 console.log("JSON error") 被打印出来。

我需要一些帮助来解决这个问题..

我对我的代码做了一些更改以检查 const sensorData = tryParseJson(data) 的内容,如下所示。

    const sensorData = tryParseJson(data);

        if (sensorData.temperature == undefined || sensorData.humidity == undefined){
            //console.log('Temperature or Humidity is undefined');
        } else {

然后使用 IF 语句 或不 附加到 log.txt 文件。

一切正常,但仍有一个小问题。

我注意到 log.txt 文件中有些东西。如果温度或湿度的值为 25.00,则文件将为 25。将没有尾随零。如果温度为 25.4

,则不会发生这种情况

如果我在这行代码中检查 sensorData 的值 const sensorData = tryParseJson(data); 值是正确的。它们似乎随着 fs.appendFile

而改变

知道为什么吗?