No está seguro de cómo Arduino interpreta la señal RS232

1

Descargo de responsabilidad: Soy un novato.

Tengo una conexión RS232 con un lector de etiquetas RFID que estoy monitoreando a través del software en una computadora de escritorio, así como un Arduino. El dispositivo está configurado con paridad 8E1. El arduino está (hasta donde sé) configurado para la paridad 8N1. Tanto la computadora como el arduino se conectan directamente al lector y reciben exactamente la misma señal.

El arduino está leyendo una etiqueta de la siguiente manera:

10 00 62 00 10 29 C0 0F 00 39 12 C0 56 00 8D 0A

La computadora está leyendo la misma etiqueta de la siguiente manera:

30 00 E2 00 30 69 80 0F 00 59 12 80 96 00 0D 0A

Con mi (limitado) entendimiento de paridad, no puedo entender la conversión aquí. ¿Cómo interpreta el arduino estos bits para obtener esos valores?

    
pregunta Kevin de Haan

3 respuestas

1

Su lector de etiquetas está enviando datos en serie con un bit de paridad, y el Arduino no está configurado para esperar eso.

Tienes dos opciones:

  1. Configure el Arduino para leer el bit de paridad pasando SERIAL_8E1 como el segundo argumento a Serial.begin() . Una vez que hayas hecho esto, los datos deberían recibirse normalmente.

  2. Configure el dispositivo para que no envíe un bit de paridad. (El manual implica que esta es una opción).

El método que has encontrado no es óptimo. Es probable que resulte en errores de lectura impredecibles y dependientes de los datos.

    
respondido por el duskwuff
1

Gracias por toda la ayuda.

Después de hacer una investigación con un osciloscopio, he descubierto lo que está pasando:

Muestra datos puros del lector (LSB primero, espacios agregados para mayor claridad):

10 0000 11000 10 0000 00000 10 0100 01110 10 1011 00001 10 0101 00000 10
^s 0    ^3  ^p^s ^0   ^0  ^p^s ^2   ^E  ^p^s ^D   ^0  ^p^s ^A   ^0    ^s

Para un valor de datos de

0 3 0 0 2 E D 0 A 0  -> 30 00 E2 0D 0A

s es el indicador de parada, p es el bit de paridad y otros son los datos hexadecimales. Lo que está sucediendo en mi arduino es que el bit de paridad se lee como el bit más significativo para la segunda mitad del byte, luego se usa el bit menos significativo anterior para sobrescribir el nuevo bit menos significativo de ese medio byte.

Aplicado al ejemplo anterior:

11000 -> 1000
00000 -> 0000
01110 -> 0110
00001 -> 0001
00000 -> 0000

que produce:

0 1 0 0 2 6 D 8 A 0 -> 10 00 62 8D 0A

explicando la conversión que ves en mi ejemplo original en los bytes de inicio y fin:

30 00 E2 0D 0A -> 10 00 62 8D 0A

Si por alguna razón alguien más se encuentra con este problema increíblemente específico, he convertido los datos de nuevo en la lógica arduino con estas funciones (no son óptimas):

byte fixBits(byte rc) {
    byte five = rc & 0x10;
    byte six = getParity(rc) << 5;
    byte hex1 = (rc & 0xF0) << 1;
    byte hex2 = rc & 0x0F;
    return ((hex2 | hex1) & 0xCF) | five | six; // bit masking
}

byte getParity(byte rc) {
    int sum = 0;
    byte test = rc;
    for (int i = 0; i < 8; i++) {
        sum += test & 1;
        test >> 1;
    }
    return sum & 1;
}

Si alguien puede describir exactamente por qué sucede esto, me gustaría saberlo, pero de lo contrario este problema se solucionó.

    
respondido por el Kevin de Haan
0

El bit de paridad no será parte de los datos. Si tiene un osciloscopio o un complemento de analizador lógico y supervise los bits uno por uno. Tu entenderás.

Ardiino no está configurado para esperar bit de paridad. Actualmente, arduino informará los errores en los casos en que el bit de paridad no sea uno. Supervise los registros de estado de errores de UART. Arduino espera que la ubicación donde se coloca el bit de paridad (por el lector RFID) sea siempre uno (STOP bit)

  

¿Cómo interpreta la computadora estos bits para obtener esos valores?

La computadora no funcionará con los datos recibidos. Extraerá los datos de la posición de las bases de datos como está ... Y luego calcula la paridad ... Si la paridad recibida no coincide con la paridad calculada, se establecerá un indicador de error de paridad en el registro de errores. Es tarea del programa verificar su estado cada vez que se reciben los datos de la RFID.

    
respondido por el Umar

Lea otras preguntas en las etiquetas