Datos seriales recibidos en bits incorrectos

2

Tengo una interfaz RS422 configurada entre un Arduino y un dispositivo personalizado. El dispositivo está configurado para transmitir un encabezado de 16 bits, seguido de 66 bytes de datos, a una velocidad en baudios de 460.800 y a 200Hz. Esto no se puede cambiar.

He leído en línea que la serie Arduino puede manejar 460.800 bps sin ningún problema. De hecho, me he comunicado con éxito entre MatLab y Arduino a esa velocidad sin problemas. También he confirmado que el dispositivo funciona, ya que cuando está conectado directamente a la computadora, se lee bien.

Cuando trato de leer los datos con Arduino, no obtengo lo que se espera. El encabezado que se supone que debo obtener es 0x55AA. Sin embargo, estoy obteniendo 0xD56A la mayor parte del tiempo, pero a veces obtengo valores como 0xB5CA. Parece que la segunda mitad de cada byte es correcta, pero no la primera, y tengo algunos bits subiendo y otros bajando cuando no deberían. Debido a esto, cuestiono la validez de los datos que se transmiten.

¿Puede alguien explicarme por qué ocurre esto y qué soluciones puedo intentar remediar, por favor?

Gracias

ACTUALIZACIÓN: He mirado a través de un osciloscopio y puedo ver la forma de onda que sale como 0x55AA, como debería ser. He aumentado el búfer serial de Arduino y he cambiado los tableros, pero el problema persiste.

Logré que funcionara a una velocidad inferior (115.200), pero necesito que esté en 460.800. A esta tasa de baudios más baja, obtendría 0x55AA, pero tan pronto como lo incrementé a 460,800, pierdo estos datos y se convertirá en como se mencionó anteriormente.

    
pregunta Tom

2 respuestas

2

Primero, veamos los datos que mencionas:

0x55AA  0101010110101010
0xD56A  1101010101101010
0xB5CA  1011010111001010

Como podemos ver, los datos están cerca, pero ligeramente apagados. Las razones para que los datos en serie estén "ligeramente apagados" son muchas, pero una obvia en su caso particular es la velocidad de datos en serie. Para que los datos en serie asíncronos se reciban correctamente, el reloj original debe volver a crearse en el extremo receptor. Una regla de oro para los enlaces en serie es que si las velocidades de reloj están desactivadas en más del 3%, obtendrá errores muy parecidos a los que describe.

Por lo tanto, a una velocidad de 460,800 bits / segundo, eso es un poco más de 2.27 \ $ \ mu \ $ s por bit. Aquí hay algunos consejos para solucionar problemas:

  1. verifique los relojes de velocidad de bits en ambos extremos y asegúrese de que las frecuencias estén dentro del 3% entre sí.
  2. mantenga su cableado lo más corto posible.
  3. verifique la terminación de la línea en ambos extremos para asegurarse de que tenga la misma impedancia que la línea.
  4. compruebe la forma de onda recibida con un osciloscopio. Busque timbres o transiciones lentas.

También puedes considerar si hay un CRC en el paquete que al menos te ayude a detectar un error.

Cómo comprobar los relojes

Primero, permítame indicar mis suposiciones:

  1. cada lado puede enviar datos arbitrarios
  2. los datos se envían en formato 8-N-1 (8 bits de datos, sin paridad, 1 bit de parada)
  3. puede configurar cualquiera de los extremos para enviar continuamente

Dicho esto, veamos cómo se envían normalmente los datos en serie. Veamos los bytes 0x55, 0x55 , ya que podrían enviarse en un enlace de datos de un solo extremo (RS-232).

+   +---+   +---+   +---+   +---+   +---+   +---+   +---+   +---+   +---+   +---
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   
+---+   +---+   +---+   +---+   +---+   +---+   +---+   +---+   +---+   +---+   
  S   1   0   1   0   1   0   1   0   P   S   1   0   1   0   1   0   1   0   P 

En este diagrama, S es un bit de inicio y P es un bit de parada y los 8 bits de datos se envían primero con el bit menos significativo, como es habitual. Al observar esto, debería quedar claro que si mide la frecuencia de esta forma de onda, debería ser exactamente la mitad de la velocidad de bits.

    
respondido por el Edward
0

¿Qué velocidad de reloj usas?

Con un reloj de 8 MHz no puedo encontrar un valor de preescalador aceptable para 460800 baudios. 14.7456 MHz podría hacer el trabajo ("Calculadora de velocidad de transmisión AVR de WormFood").

    
respondido por el auchmonoabspielbar

Lea otras preguntas en las etiquetas