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 de transmisión de 460.800 y 200 Hz. 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 en baudios sin problemas. También he confirmado que el dispositivo funciona, ya que cuando se conecta directamente a la computadora, se lee bien.
Cuando trato de leer los datos usando el Arduino, no obtengo lo que se espera. El encabezado que se supone que debo recibir es 0x55AA. Sin embargo, obtengo 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é sucede esto y qué soluciones puedo intentar para remediar esto, por favor?
Gracias
ACTUALIZACIÓN: he mirado con un osciloscopio y puedo ver que la forma de onda sale como 0x55AA, como debería ser. Aumenté el búfer serial de Arduino y cambié las placas, pero el problema persiste.
Me las arreglé para hacerlo funcionar a una tasa de baudios más baja (115,200), pero necesito tenerlo configurado en 460,800. A esta tasa de baudios más baja, obtendría 0x55AA, pero tan pronto como lo subo a 460,800, pierdo estos datos y se vuelve como se mencionó anteriormente.
Primero, veamos los datos que mencionas:
0x55AA 0101010110101010
0xD56A 1101010101101010
0xB5CA 1011010111001010
Como podemos ver, los datos son cercanos, pero ligeramente desviados. Las razones por las que los datos en serie están "ligeramente apagados" son muchas, pero una obvia en su caso particular es la tasa de datos en serie. Para que los datos seriales asincrónicos se reciban correctamente, el reloj original debe recrearse en el extremo receptor. Una regla general para los enlaces en serie es que si las frecuencias de reloj están desfasadas en más del 3 %, obtendrá errores muy parecidos a los que describe.
Así que a una velocidad de 460.800 bits/segundo, eso es un poco más de 2,27 s por bit. Estos son algunos consejos para solucionar problemas:
También puede considerar si hay un CRC en el paquete que al menos lo ayude a detectar un error.
Primero, permítanme exponer mis suposiciones:
Dicho esto, veamos cómo se envían normalmente los datos en serie. Veamos los bytes 0x55, 0x55
tal como 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
hay un bit de inicio y P
un bit de parada y los 8 bits de datos se envían primero, como es habitual, el bit menos significativo. Debería quedar claro al observar esto que si mide la frecuencia de esta forma de onda, debería ser exactamente la mitad de la tasa de bits.
¿Qué frecuencia de reloj usas?
Con un reloj de 8 MHz no encuentro un valor de prescaler aceptable para 460800 baudios. 14.7456 MHz podría hacer el trabajo ("Calculadora de tasa de baudios AVR de WormFood").
PlasmaHH
usuario_1818839
Andy alias
Tomás
Tomás
PlasmaHH
Tomás