我在使用 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
而改变
知道为什么吗?
我定期从温室隧道中的 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
而改变知道为什么吗?