Tengo una tarea bastante interesante. La tarea es la siguiente:
Odroid C2 (computadora de placa única) que se ejecuta en Android 5.1 tiene que recibir la identificación de la tarjeta de RFID-reader sobre la interfaz Wiegand
.
Para lograr esto, mi aplicación escucha UART
port (/ dev / ttyS1) con el permiso SU
:
public SerialPort(...){
Process su = Runtime.getRuntime().exec("/system/bin/su");
String cmd = "chmod 666 " + "path/to/the/device" + "\n"
+ "exit\n";
su.getOutputStream().write(cmd.getBytes());
...
}
y la configuración de tty
en JNI
de la siguiente manera:
JNIEXPORT jobject JNICALL Java_android_1serialport_1api_SerialPort_open(...) {
int fd;
speed_t speed;
jobject mFileDescriptor;
/* Opening device */
{
fd = open("path/to/the/device", O_RDWR | O_NOCTTY | O_NDELAY);
}
//all check blocks are omitted for the sake of simplicity
/* Configure device */
{
struct termios cfg;
cfsetospeed(&cfg, speed);
cfsetispeed(&cfg, speed);
cfg.c_cflag |= (CLOCAL | CREAD); //ignore modem controls
cfg.c_cflag &= ~CSIZE;
cfg.c_cflag |= CS8; //8-bit characters
cfg.c_cflag &= ~PARENB; //no parity bit
cfg.c_cflag &= ~CSTOPB; //only need 1 stop bit
cfg.c_cflag &= ~CRTSCTS; //no hardware flowcontrol
//setup for non-canonical mode
cfg.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR
| ICRNL | IXON);
cfg.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
cfg.c_oflag &= ~OPOST;
//fetch bytes as they become available
cfg.c_cc[VMIN] = 1;
cfg.c_cc[VTIME] = 0;
//creating FileDescriptor...
return mFileDescriptor;
}
Permite pasar al lado Java
... Aquí simplemente pasamos el correspondiente FileDescriptor
como argumento al objeto FileInputStream
para leerlo más adelante
public SerialPort(...){
...
FileInputStream mFileInputStream;
FileDescriptor mFd;
mFd = open(...); //recieve newly created FileDescriptor
mFileInputStream = new FileInputStream(mFd); //pass it as argument to FileInputStream
...
}
Leí los datos de FileInputStream
en otra clase con un hilo separado. Y aquí es donde sale mi problema.
Cada vez que coloco la tarjeta rfid delante de la función read()
del lector, se activa 15 veces con hex_val
igual a FC
(Dec = 252).
public FooClass(...){
...
byte[] buffer = new byte[64];
int size = mInputStream.read(buffer);
if (size > 0) {
for (int j = 0; j < buffer.length; j++) {
String val = String.format("%02X ", buffer[j]);
Log.v("hex_val", val);
}
}
...
}
Buscando en Internet, tropecé con una página
mencionando este valor como un byte de error.
Estaré infinitamente agradecido por cualquier sugerencia o respuesta a las siguientes preguntas:
- ¿Es mi configuración
UART
apropiada o no? ¿Debería ser específico para un protocoloWiegand
? - ¿Por qué recibo 15 bytes en lugar de 3Bytes (W26) o 4Bytes (W34)?
P.S. Si tiene un bosquejo Java
o C
trabajando, déjelo aquí, gracias.