SerialPort Node.js завис в состоянии «Ошибка»

Я пытаюсь заставить свой Arduino отправлять данные на мой компьютер с помощью последовательного порта Node.js. Все компилируется, мой Arduino работает хорошо и отправляет данные в последовательный монитор, но программа всегда переходит в myPort.on('close'), и я не могу понять, почему.

//импортировать пакет js последовательного порта
const SerialPort = require('serialport');

//открытие порта
var myPort = new SerialPort("/dev/ttyS2", {
  baudRate: 9600,
  //парсер: SerialPort.parsers.raw
});

//как передать readline
const Readline = SerialPort.parsers.Readline;
const parser = new Readline();
myPort.pipe(parser);

myPort.on("open", onPortOpen);
myPort.on("data" , onData);
myPort.on("close" , onClose);
myPort.on("error" , onError);

function onPortOpen(){
    console.log("Port open");
}

function onData(data){
    console.log("data transfer completed..");
    console.log(data);
}
function onError(){
    console.log("Error. something went wrong..")
}
function onClose(){
    console.log("Port is closed. Communication terminated");
}

Может, кто-нибудь знает, в чем потенциальные причины? Я дважды проверил свой порт, и это действительно COM3, следовательно, /dev/ttyS2 для Windows 10.

, 👍0


1 ответ


1

Я вижу две проблемы в вашем коде. Я не могу сказать наверняка, связаны ли они с проблема, с которой вы столкнулись, но в любом случае:

  1. По умолчанию признаком конца строки парсера Readline является "\n", тогда как Serial.println() Arduino использует "\r\n". Для того, чтобы получить строку терминаторы совпадают, вам следует вызвать конструктор Readline с помощью { разделитель: "\r\n" } в качестве аргумента.

  2. Прохождение потока через парсер возвращает новый поток. Вам следует следите за событиями данных на этом потоке, а не на исходном порту.

Поэтому я предлагаю вам попробовать:

const parser = new Readline({ delimiter: "\r\n" });
const parsedStream = myPort.pipe(parser);

myPort.on("open", onPortOpen);
parsedStream.on("data" , onData);
...
,