1

我一直在尝试从 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: 数据: CBZZZZZZZZZZZZZZZZ^XXXXXXXX sp: 数据: XXXX X ^18082261485500005000000 !ZZZZZZZZZZZZZZZZ sp: 数据: =1808226000005

sp: 数据: CBZZZZZZZZZZZZZZZZ^XXXXXXXX sp: 数据: XXXX X ^18082261485 sp: 数据: 500005000000 !ZZZZZZZZZZZZZZZ=1808226000005

sp: 数据: CBZZZZZZZZZZZZZZZZ^XXXXXXXX sp: 数据: XXXX X ^18082261485500005000000 !ZZZZZZZZZZZZZZZZ=1808226000005

这里 X 表示持卡人姓名 Z 表示卡号

如您sp: Data:所见,日志已被调用两次或三次,但卡数据相似。无论数据如何来,我都想连接这张卡数据。任何想法。

我正在使用串口读取数据

4

1 回答 1

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());
  }
});
于 2019-01-26T15:02:29.490 回答