serialport node.js проблема чтения с буфером - PullRequest
0 голосов
/ 16 марта 2019

Цель
Мне нужно получить данные через последовательный порт для пакета команд, таких как

запись в последовательный : 'команда'
ожидаемый ответ от последовательного приемника : HEX Value

, и я использовал пакет Serial Port .


serial.js

var serialport = require('serialport');
var Readline = serialport.parsers.Readline; // make instance of Readline parser
var parser = new Readline(); // make a new parser to read ASCII lines


// list serial ports:
serialport.list(function (err, ports) {
    ports.forEach(function (port) {
        console.log("Serial Device: " + port.comName);
    });
});

// get port name from the command line:
var path = '/dev/cu.SLAB_USBtoUART' ;

var myPort = new serialport(path ,{
    baudRate: 230400,
});

// Read Line Parser
myPort.pipe(parser); // pipe the serial stream to the parser


// Handling Events
myPort.on('open', showPortOpen);
// Calling with set interval
setInterval(writeToSerial, 2000);
myPort.on('data', readSerialData);
myPort.on('close', showPortClose);
myPort.on('error', showError);

// Callback Functions
function showPortOpen() {
    console.log('port open. Data rate: ' + myPort.baudRate);
}


function writeToSerial() {
    myPort.write('?1VB');
}

function readSerialData(data) {
    buff = data;
    console.log(data);
}

function showPortClose() {
    console.log('port closed.');
}

function showError(error) {
    console.log('Serial port error: ' + error);
}

Приведенный выше код в основном устанавливает порт и записывает данные в последовательный порт, используя setInterval (function () {}, time), за которым следует событие чтения данных иего функция обратного вызова.Событие чтения данных работает нормально, но полученные данные находятся в форме буфера, и при чтении данных они разбиваются на куски.Вот вывод Вывод

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

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Данные выводятся в виде байтового буфера, потому что вы подписали обработчик события readSerialData на порт, а не подписали его на анализатор. См. Также документацию Serialport для парсеров

Вы можете просто исправить это, заменив следующую строку:

myPort.on('data', readSerialData);

с

parser.on('data', readSerialData);
0 голосов
/ 16 марта 2019

Последовательный порт правильно принимает повторяющиеся значения (в шестнадцатеричном формате) 0x0c, 0xda, 0x0c, 0xda и т. Д.

Поскольку у вас есть myPort.on('data', readSerialData);, а readSerialData выводит напрямую на консоль, он выглядит как <Buffer 0c da>, потому что это то, что принимается, и эта строка - то, как обрабатывается объект Buffer при его печати.

Существуют встроенные парсеры , которые будут обрабатывать различные входящие форматы (например, только отправлять данные при получении символа новой строки или после определенного количества определенных байтов).

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

Если вы хотите что-то сделать с этими шестнадцатеричными значениями, уже есть много вопросов, таких как преобразование буфера в массив и сама документация по Node, которые очень удобны.

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