Как правильно читать с последовательным портом в узле JS? - PullRequest
0 голосов
/ 20 мая 2018

Это код, который я имею в узле js для чтения из порта последовательных данных arduino.

var SerialPort = require('serialport');
var io = require('socket.io').listen(3000);

var serialPort = new SerialPort("COM4", {
    baudRate: 9600,
    parser: new SerialPort.parsers.Readline("\n")
});

io.sockets.on('connection', function(socket){
    socket.on('message', function(msg){
        console.log(msg);
    });

    socket.on('disconnected', function(){
        console.log('disconnected');
    });
});

var clearData = "";
var readData = "";

serialPort.on('open',function(){
    console.log('open');
    serialPort.on('data', function(data){
        console.log(data);
        readData += data.toString();
        io.sockets.emit('message',data);
    });
});

Это код, который у меня есть в Arduino, это всего лишь короткий пример.

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
Serial.println("Hello");
delay(2000);
}

Однако в консоли узла js при печати данных отображается следующее: enter image description here

Как правильно получить данные в одной строке?Чтобы иметь что-то вроде этого:

Привет
Привет
Привет

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

Я тестировал этот код на устройстве с последовательным портом, использующим протокол RS-232.Его преимущество в том, что вам не нужно устанавливать третий пакет из npm.

var recVal = '';
mySerial.on('data', function(data) {
  if(data.indexOf('\n') != -1) {
    io.emit('serial:data', {
      value: recVal
    });
    console.log("Data: ", recVal.toString());
    recVal = '';
  } else {
    recVal = recVal.concat(data);
  }
});
0 голосов
/ 12 июня 2018

Я не могу протестировать этот конец в конец (рядом нет arduino), но, поскольку serialport, кажется, реализует поток с возможностью чтения, я бы попробовал использовать scramjet, например:

const {StringStream} = require('scramjet');

serialport.on('open', () => console.log('open');
serialport.pipe(new StringStream) // pipe the stream to scramjet StringStream
    .lines('\n')                  // split per line
    .each(                        // send message per every line
        data => io.sockets.emit('message',data)
    );

Scramjet решит проблему readline для вас.

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