Что я пытаюсь сделать:
Я пытаюсь, чтобы arduino отправлял данные через последовательный порт на сервер узла. Затем сервер узлов анализирует эти данные как JSON и использует их для отображения информации (например, температуры или времени, нажатия кнопок и т. Д.). У меня все это работает, но не идеально. Похоже, что данные поступают после огромных задержек, а не каждую секунду. Это также кажется случайным, так как я получу примерно три объекта один раз, а затем, может быть, десять. Arduino настроен на отправку данных каждые две секунды, и он был протестирован. То есть информация отображается практически в реальном времени, когда я тестировал ее в консоли. (см. serial-test.js) Я считаю, что это как-то связано с анализатором JSON и сервером, работающим по одному сценарию. Я пытался использовать обещание, но сомневаюсь, что это исправит это. Я новичок, поэтому извиняюсь за любые ошибки.
PS: Экспресс должен был требоваться дважды, не знаю почему, я вижу его приложение и экспресс, но когда я настроил все на одно требование, все сломалось, и я оставил его.
PPS: только что попытался проанализировать данные на стороне клиента, он не , кажется, решил проблему.
Я использую узел SerialPort , чтобы получить данные из arduino; узел HTTP, узел Express и узел Socket.io для сервера.
Код Arduino: (старый загрузчик Arduino nano / ATMega328p)
boolean blah = true;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
thatFunction();
}
void thatFunction(){
if(blah){
Serial.println("{\"state\": \"GOOD\", \"name\": \"thing1\"}");
blah = false;
} else {
Serial.println("{\"state\": \"BAD\", \"name\": \"thing2\"}");
blah = true;
}
}
Сервер JS (Сервер?)
const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
const port = new SerialPort('COM4', { baudRate: 9600 });
const debugMode = false;
let str;
let parser = new Readline();
port.pipe(parser);
// Server
const express = require('express')
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
// Needed to fix the index.html not finding the CSS file.
// Files must be in the folder 'public'
app.use(express.static('public'));
app.get('/', function(req, res){
res.sendFile(__dirname + '/public/');
});
io.on('connection', function(socket){
console.log('a user connected');
socket.on('disconnect', function(){
console.log('user disconnected');
});
});
http.listen(8000, function(){
console.log('listening on *:8000');
});
// Parser is too slow!?? Maybe it can't work along side the server..
// Parsed Serial Data being 'emitted' to the socket.io server. main.js listens for those emits, and displays the info.
parser.on('data', function (data) {
str = JSON.parse(data); //Then parse it
console.log(str);
io.emit('parsed-data', str);
});
Основной JS (Клиентский?)
let dataDisplay = document.getElementById("woop");
let socket = io();
socket.on('connect', function () {
socket.on('parsed-data', function (json) {
console.log(json);
dataDisplay.innerText = json.state;
});
});
Индекс
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Serial Port Data Viewer</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" media="screen" href="./styles/main.css" />
</head>
<body>
<h1 id="woop"></h1>
<script src="/socket.io/socket.io.js"></script>
<script src="./javascript/main.js"></script>
</body>
</html>
Serial-тест
// Node serial port listener
const SerialPort = require('serialport');
const Readline = require('@serialport/parser-readline');
const debugMode = true;
const port = new SerialPort('COM4', { baudRate: 9600 });
let parser = new Readline();
let str;
port.pipe(parser);
SerialPort.list((err, ports) => {
console.log(ports);
})
parser.on('data', function (data) {
str = JSON.parse(data);
if (debugMode) {
console.log('Data:', data);
if (str.state == "GOOD") {
console.log(str.name);
// process.stdout.write("\u001b[2J\u001b[0;0H");
console.log("\x1b[32m%s\x1b[0m", str.state);
} else if (str.state == "BAD") {
console.log(str.name);
// process.stdout.write("\u001b[2J\u001b[0;0H");
console.log("\x1b[31m%s\x1b[0m", str.state);
}
}
});
Не совсем уверен, где еще можно посмотреть на данный момент, и я чувствую, что исчерпал все возможные поиски в Google, о которых только могу подумать. Я ценю любую помощь, которую я могу получить!
Источники, которые я проверял для информации: