目前在应用中存在问题。
我的应用程序旨在在Raspberry PI上打开RFID阅读器。它继续读取传入的RFID标签。
代码如下;
// Socket.io server details
var io = require('socket.io').listen(3000);
// Serialport plugin declared and made a serialport variable
var serialport = require("serialport");
var SerialPort = serialport.SerialPort;
// Variable containing technical USB port details
var serialPort = new SerialPort("/dev/ttyUSB0", {baudrate: 2400, parser: serialport.parsers.readline("\n")} , false); // this is the openImmediately flag [default is true]
io.sockets.on('connection', function (socket) {
console.log('user connected');
socket.on('ping', function (data) {
serialPort.open(function () {
// Open notification
console.log('opening RFID scanner');
//Start listening
serialPort.on('data', function(data) {
if (data.trim() !== '') {
io.sockets.emit('pong', data);
socket.disconnect();
}
});
});
});
});
我打开应用程序,它运行正常。它经常可以读取卡片的标签。然而;当我使用不同的卡时,Node.JS似乎使用某种缓冲区。
一个例子;
我扫描卡A,返回标签AAA。 我扫描卡A,返回标签AAA。 我扫描卡B,返回标签AAA。 我扫描卡B,返回标签AAA。 我扫描卡片B,返回标签BBB(应该返回的那个)。
更改标签时似乎总会发生这种情况。
Node.JS中是否存在某种缓冲区,它存储了尚未传输的数据缓冲区?
我知道.drain (callback),但我怎么能以正确的方式实现这个呢?
答案 0 :(得分:5)
我不完全理解node-serialport库,但在接收数据时确实遇到了类似的问题。
每次我的数据值发生变化时,我总是会收到前一个值,然后才会在下一个“数据”块上接收到正确的值。
我通过在node-serialport API中使用“flush”方法解决了这个问题。
粗略的做法是:
sp.flush(function(err,results){});
在断开套接字连接之前,请尝试对此进行测试。
if (data.trim() !== '') {
io.sockets.emit('pong', data);
sp.flush(function(err,results){});
socket.disconnect();
}