Отображение последовательных данных arduino на сервере на базе node.js. - PullRequest
0 голосов
/ 05 января 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...