Я пытаюсь прочитать данные чип-карты с помощью устройства чтения карт, подключенного к последовательному USB-порту моего RPi.
Хотя я могу читать и писать, у меня возникают проблемы с настройкой парсеров, обещаний и т. Д. c ...
Основная проблема в том, что при чтении asyn c я не могу использовать стандартный синтаксический анализатор, так как ридер общается в двоичных данных (я использую буфер). Полученные данные НЕ обозначаются стандартным символом.
Протокол:
Я отправляю:
STX (0x02)
LenMsb (Most significant byte of package length)
LenLsb (Least sig. byte of package length)
Param1
Param2
Data (if needed)
ETX (0x03)
BCC (checksum)
На который я получил ACK (0x06) или NAK (0x15)
Если я получаю ACK, я отправляю ENQ (0x05)
, на который читатель отвечает пакетом, отформатированным, как указано выше.
Итак, в основном мне нужно начать читаем пакет, проверяем длину, ждем ETX, проверяем контрольную сумму и только потом обрабатываем его.
Может кто-нибудь, пожалуйста, помогите с его настройкой .. Я запуталась с глобальными буферами и т.д. * ..
Это вызов, который я делаю, чтобы сделать все это.
function sp288do(port, cmd){
return new Promise(function(resolve, reject) {
// I send the prepared command
port.write(cmdPrep(cmd), function () {
console.log('Send CMD')
port.on('data', function(data) {
// log what I read
console.log ('<<------', data);
if (data[0] == NAK) { //not awk
console.log("Rcvd NAK");
data = null;
reject(NAK)
return;
}
if(data[0] == ACK) { //awk
console.log ("Rcvd ACK");
// data = null;
data = null;
console.log('Send ENQ')
port.write(Buffer.from([ENQ]), function () {
buffer = [];
})
return;
}
/***
if I get here, it means I have to wait for the whole data packet.
The total package length will be in buffer[2], plus STR, lMSB, lLSB .... EOT, BCC
So, if it tells me 2 bytes of data in buffer[2], I have to wait for 2 + 5 = 7 bytes.
***/
var expected = 0;
for (i=0; i<data.length; i++) {
buffer[buffer.length] = data[i];
if(buffer.length > 3 && expected == 0) {
expected = buffer[2] + 5;
}
if (expected > 0 && buffer.length >= expected)
return(resolve(buffer));
}
})
});
});
}
Я вызываю функцию с помощью:
sp288do(sp288, cmd).then(res => {
console.log("Result:" , res);
console.log ("=====================================================");
})
Что происходит, так это то, что первый когда я вызываю функцию, все работает нормально:
========== Requesting Presence ====================
SENDING COMMAND
Send CMD
<<------ <Buffer 06>
Rcvd ACK
Send ENQ
<<------ <Buffer 02>
<<------ <Buffer 00 03>
<<------ <Buffer 31 30 4e>
<<------ <Buffer 03 4d>
Result: [
2, 0, 3, 49,
48, 78, 3, 77
]
=====================================================
Но если я вызываю ее снова, это как если бы она считывала последовательный порт дважды:
========== Requesting Presence ====================
SENDING COMMAND
Send CMD
<<------ <Buffer 06>
Rcvd ACK
Send ENQ
<<------ <Buffer 06>
Rcvd ACK
Send ENQ
<<------ <Buffer 02>
<<------ <Buffer 02>
<<------ <Buffer 00 03 31>
<<------ <Buffer 00 03 31>
Result: [ 2, 2, 0, 3, 49, 0 ]
=====================================================
<<------ <Buffer 30 4e 03 4d>
<<------ <Buffer 30 4e 03 4d>
и с каждым разом все становится хуже time:
========== Requesting Presence ====================
SENDING COMMAND
Send CMD
<<------ <Buffer 06>
Rcvd ACK
Send ENQ
<<------ <Buffer 06>
Rcvd ACK
Send ENQ
<<------ <Buffer 06>
Rcvd ACK
Send ENQ
<<------ <Buffer 02 00>
<<------ <Buffer 02 00>
<<------ <Buffer 02 00>
<<------ <Buffer 03 31 30>
<<------ <Buffer 03 31 30>
<<------ <Buffer 03 31 30>
Result: [
2, 0, 2, 0, 2,
0, 3, 3, 3
]
=====================================================
<<------ <Buffer 4e 03 4d>
<<------ <Buffer 4e 03 4d>
<<------ <Buffer 4e 03 4d>
Я понял, что каждый раз, когда я вызываю функцию, я «устанавливаю» другого слушателя с:
port.on('data', function(data) {
Но я просто не понимаю, как это обойти.