Почему не работает анализатор узла SerialPort Readline? - PullRequest
0 голосов
/ 30 апреля 2018

У меня Arduino отправляет очень простые сообщения:

Serial.print('R');
Serial.println(1);

или

Serial.print('R');
Serial.println(2);

Я пытаюсь прочитать каждую строку, используя node.js и модуль SerialPort, но получаю противоречивые результаты:

Data: <Buffer 52 31 0d 0a> R1

Data: <Buffer 52 32 0d 0a> R2

Data: <Buffer 52 31 0d 0a> R1

Data: <Buffer 52 32 0d 0a> R2

Data: <Buffer 52 31 0d 0a> R1

Data: <Buffer 52 32 0d 0a> R2

Data: <Buffer 52 31 0d 0a> R1

Data: <Buffer 52 32 0d 0a> R2

Data: <Buffer 52> R
Data: <Buffer 31 0d 0a> 1

Data: <Buffer 52 32 0d 0a> R2

А вот как я пытался разобрать:

this.port = new SerialPort(portName, {
            baudRate: baudRate,
            autoOpen:false,
            flowControl: false,
            parser: new Readline("\r\n")
        });

        this.port.open(function (err) {
            if (err) {
                return console.log('Error opening port: ', err.message);
            }

            console.log("port open!");

        });

        this.port.on('error', function(err) {
            console.log('Error: ', err.message);
        })

        this.port.on('open', function() {
            console.log("open event called");
        });

        this.port.on('data', function (data) {
            console.log('Data:', data,data.toString('utf8'));
        });

Короче говоря: я ожидаю, что сообщения R1, R2 поступают последовательно, а не разбиваются так:

Data: <Buffer 52> R
Data: <Buffer 31 0d 0a> 1

Я передаю ("\r\n" / 0x0d 0x0a) на Readline. Что мне не хватает? Как получить последовательный разбор новой строки, используя SerialPort в узле?

1 Ответ

0 голосов
/ 01 мая 2018

Я думаю, что решение вашей проблемы требует привязки события к объекту parser, в то время как вы в настоящее время прослушиваете его на объекте port. Данные, поступающие через порт, не всегда заканчиваются на 0x0d 0x0a (*). Эти два байта являются сигналом конца строки только для синтаксического анализатора ReadLine.

Таким образом, возможно, вам следует написать этот слушатель вместо кода:

// I'm not actually sure where parser lives, I'm not
// in the condition of trying by myself...
this.port.parser.on('data', function (data) {
  console.log('Data:', data,data.toString('utf8'));
});

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

(*) В первом (неправильном) комментарии, который я немедленно удалил, я спросил, почему вы ставите оба байта в качестве завершения в строку 0x0d 0x0a (\r\n), и не просто 0x0a (\n), а Serial.println Метод фактически записывает оба байта по умолчанию.

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