node.js - 如何在节点 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 的控制台中,打印数据时会显示以下内容:
如何在一行中正确获取数据?有这样的东西:
你好
你好
你好
解决方案
我无法端到端地测试这个(附近没有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 问题。
推荐阅读
- php - PHPExcel_Calculation_Exception insert formula in field
- scala - Looking for help in Nested groupBy with scalikejdbc?
- java - Java 8 / Fernflower 反编译器:错误或功能
- html - 当表单有效或在控制器中引用表单时,无法让 ng-message 消失
- excel - Excel公式计算单个单元格中的多个可能组合
- php - 在 PHP 中避免空值时,我可以重新实现 isset 吗?
- c# - 通过表单发布的数据挂起应用程序
- travis-ci - 使用 Travis CI 发布到 NPMJS
- angular - 使用自定义指令值选择性地显示表单元素
- aws-lambda - 在 AWS Lambda 中增加重试次数