c# - niños - problemas de lectura y escritura pdf
Problemas con la lectura de la tarjeta inteligente (2)
Mientras traes la tarjeta A cerca del lector de tarjetas y falla. Después de eso, cada vez que acerca la tarjeta A al lector de tarjetas, se produce un error.
No estoy seguro, pero supongo que cuando falla alguna, la segunda posición de la matriz de bytes rs[1]
contiene el código de la falla. Por lo tanto, después de eso, cada vez que acerca la tarjeta A al lector de tarjetas, se produce un error porque la segunda posición de la matriz de bytes podría tener un valor anterior.
Por lo tanto, intente borrar la matriz de bytes que podría resolver su problema.
Tengo un lector que tiene un documento casi exacto como este: http://www.jinmuyu.com/download/JMY680A_EN.pdf principal diferencia es que mi lector afirma que también admite tarjetas TYPE B.
Tengo tres tarjetas ISO 14443, que pruebo consecutivamente, y siguiendo el código:
byte[] rs = null;
Thread.Sleep(500);
// Set module Idle
Random r = new Random();
byte rInt = (byte) r.Next(0, 255);
rs = send(new byte[] { 0x12, rInt });
if (rs[1] == 0xED)
throw new Exception("Failed set idle");
Thread.Sleep(500);
//// Request B
//rs = send(new byte[] { 0x60, 0x00, 0x00 });
//if (rs[1] == 0x9F)
// throw new Exception("Failed card requestB");
// RequestA
rs = send(new byte[] { 0x20, 0x00 });
if (rs[1] == 0xDF)
throw new Exception("Failed card requestA");
// Reset cardA
rs = send(new byte[] { 0x30 });
if(rs[1] == 0xCF)
throw new Exception("Failed card reset");
// Do other work, Send some APDU to card, etc.
// ........
// Exit program
La mayoría de las veces, este código funciona bien con las tres tarjetas. Sin embargo, a veces, cuando RequestA
una de las tarjetas al lector, falla la llamada de solicitud de tarjeta A (solicitud RequestA
). Entonces siempre fallará con esta tarjeta, hasta que traiga una nueva tarjeta al lector. ¿Alguien tiene alguna idea de lo que puede estar causando esto? Tal vez necesito algunos retrasos entre llamadas? ¿O necesita llamar a otra función ( relacionada con RequestA
) antes de llamar a RequestA
?
send
es un método implementado utilizando la clase SerialPort
. De la siguiente manera:
- En cada invocación de envío, se crea un nuevo objeto
SerialPort
- Llamada
Open
en objeto creado arriba -
Write
yRead
algunos datos - Cierre la conexión utilizando el objeto
Close
en que se creó en esta instancia de método
por cierto esta es una respuesta exitosa de una de las tarjetas (en la que el lector falló una vez) en el comando RequestA:
ID | ATQ | SAK
0xe1 0x8f 0x68 0xe6 0x04 0x00 0x28
No puedo estar seguro de cuál es el problema de su código, pero parece ser un problema cuando una conexión recibe un error, no se abre ninguna conexión nueva. Debido a que SerialPort es un recurso de hardware que necesitará para manejar el desecho, el SerialPort probablemente implementa IDisposable, lo que significa que puede usar el uso asegúrese de que la conexión esté cerrada y desechada. Probablemente, traer una nueva tarjeta hará esto, sin embargo, cuando use la misma tarjeta, seguirá trabajando con el puerto serie en estado de falla.