我一直在尝试从Desko Keyboard上获取信用卡数据,但最终成功了,但问题是我每次刷卡都以不同的方式获取信用卡数据
下面是我的JS代码
var fs = require('Serialport');
function listenDevice() {
this.port = fs('COM8');
let dataComplete = '';
let count = 0;
this.port.on('open', () => {
console.log('sp: ' + this.port.path + ' port open event');
this.port.set({ dtr: true, rts: true }, function (err) {
if (err) {
console.log('Set Error: ', err.message);
this.isServiceError = true;
this.serviceErrorText = err;
}
});
});
this.port.on('data', (data) => {
console.log('sp: Data: ', data.toString('utf-8'));
});
}
这是我得到的卡数据的模式:
sp:数据:CBZZZZZZZZZZZZZZZZZZ ^ XXXXXXXX sp:数据:XXXX X ^ 18082261485500005000000 !ZZZZZZZZZZZZZZZZZZ sp:数据:= 1808226000005
sp:数据:CBZZZZZZZZZZZZZZZZZZ ^ XXXXXXXX sp:数据:XXXX X ^ 18082261485 sp:数据:500005000000 !ZZZZZZZZZZZZZZZZZZ = 1808226000005
sp:数据:CBZZZZZZZZZZZZZZZZZZ ^ XXXXXXXX sp:数据:XXXX X ^ 18082261485500005000000 !ZZZZZZZZZZZZZZZZZZ = 1808226000005
此处X表示持卡人姓名 Z代表卡号
您可以sp: Data:
登录两次或三次,但是卡数据相似。无论数据如何发送,我都希望保留此卡数据。任何想法。
我正在使用串行端口读取数据
答案 0 :(得分:1)
您不能假设您将在单个data
事件中拥有所有数据。您需要缓冲数据,并使用有关协议的已知信息来确定何时拥有足够的数据。
由于您只需要少量数据,因此可以将运行中的数据缓冲区串联在一起是可以接受的。
您将想要执行以下操作:
let buffer;
this.port.on('data', (data) => {
buffer = Buffer.concat([buffer, data]);
if (/* your code to determine if you have enough data */) {
const packet = buffer.slice(0, /* expected length */);
buffer = buffer.slice(/* expected length*/);
console.log(packet.toString());
}
});