Отображение последовательных данных arduino на сервере на основе node.js

Что я пытаюсь сделать: я пытаюсь заставить 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>

Серийное тестирование

// 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, о которых только мог подумать. Я ценю любую помощь, которую я могу получить!

Источники, которые я проверил для получения информации:


person fr-Dmli    schedule 05.01.2019    source источник