首页 > 解决方案 > 如何在节点 js 中使用串行端口正确读取?

问题描述

这是我在节点 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);
}

但是,在 node js 的控制台中,打印数据时会显示以下内容: 在此处输入图像描述

如何在一行中正确获取数据?有这样的东西:

你好
你好
你好

标签: node.jsarduinonode-serialport

解决方案


我无法端到端地测试这个(附近没有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 问题。


推荐阅读