这是我在节点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);
}
如何在一行中正确获取数据? 有这样的事情:
您好
你好
你好
答案 0 :(得分:2)
我无法测试这个端到端(没有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问题。
答案 1 :(得分:0)
我在使用RS-232协议的串行端口设备上测试了此代码。它的优点是您不需要从npm安装第三个软件包。
var recVal = '';
mySerial.on('data', function(data) {
if(data.indexOf('\n') != -1) {
io.emit('serial:data', {
value: recVal
});
console.log("Data: ", recVal.toString());
recVal = '';
} else {
recVal = recVal.concat(data);
}
});