Cómo enviar datos seriales ASYNC 8,N,1 a través de una interfaz SPI usando dos placas Arduino Uno

Necesita ayuda para enviar datos ASYNC entre dos microcontroladores Arduino UNO R3.

El diseño del sistema sigue:

Módem RS232 19,200,8,N,1 --> UNO-1 D0=(rx), D1=(tx). Los parámetros RS232 no se pueden cambiar porque el dispositivo está codificado. UNO-1 ejecuta el boceto enviando comandos AT y analizando los datos recibidos. Los datos analizados deben enviarse a otro módem RS232 pero, lamentablemente, este dispositivo está codificado para 9600, 7,E,2. Solo hay una USART o la UNO.

Mi idea es aprovechar un 2º UNO R3 para convertir los datos a 9600, 7,E,2.

Entonces... Módem 19,200,8,N,1 --> UNO-1 -->INTERFAZ SPI (mstr) --> UNO-2 --> puerto serie del software --> Dispositivo 9600, 7, E, 2.

Intenté reconfigurar el USART en el UNO antes de enviar datos a cada dispositivo ASYNC. Apareció el problema de que se reciben datos importantes y no solicitados del módem 19,200 mientras que el UNO está enviando datos al otro dispositivo ASYNC en 9600,7, E, 2.

La interfaz SPI parece ser mi única opción. ¿Alguien puede ayudar?

¿No sería más sencillo utilizar el software serial en el primer Uno? Un bucle ajustado de carácter por carácter debería ser capaz de mantenerse al día. ¿O obtener una MCU con múltiples puertos seriales de hardware?
... pero SPI es síncrono, utiliza una señal de reloj sin bits estándar de inicio, parada o sincronización. No puede obligar al hardware a hacer algo para lo que no fue diseñado. Creo que @ChrisStratton tiene razón: necesitará una solución de software. Aunque todavía no entiendo qué problemas tiene realmente con el hardware UART. Tu descripción está un poco por todas partes.
@ KurtE.Clothier: creo que la propuesta era que la primera placa hiciera Asynch Serial a SPI, y la segunda hiciera SPI a Asynch Serial, pero eso es bastante complicado.
@ChrisStratton: eso es lo que pensé que quería decir, pero parecía una idea tan extraña que no podía estar seguro. La gente necesita aprender a hacer diagramas de bloques.

Respuestas (1)

Puede usar la Biblioteca de transferencia fácil de Bill Porter para transferir paquetes de ida y vuelta entre dos Arduino, a través de I2C o VirtualWire. Tenga en cuenta que el SPI tiene una relación maestro/esclavo, por lo que el lado maestro siempre está sondeando cuando está inactivo para recibir. El ET anterior es asíncrono.

Estoy de acuerdo @Chris Stratton. Creo que un solo UNO con un Hard UART en 19200 y un Soft UART en 9600 harían el trabajo.

De todos modos, es posible que el lado 19200 requiera la capacidad de fluir desde el módem (o host), probablemente usando cualquiera de los pines de salida como comandos CTS o XON/XOFF. Tenga en cuenta que cuando afirma el CTS, el host no enviará el siguiente búfer, sino que finalizará su búfer actual. Por lo tanto, el búfer rx de Arduino debe ser lo suficientemente grande para obtener un paquete y enviar el siguiente paquete. El ATmega328 solo tiene 2K. Entonces, su paquete máximo debería ser 512 (también conocido como 1/4) o menos, menos la sala de operaciones. etc...

Dicho todo esto, la mayoría de los módems (que tienen menos de 15 años) deberían ser compatibles con AT&Q5 para activar el modo confiable automático con almacenamiento en búfer de velocidad. Permitiéndole detectar automáticamente la velocidad en baudios del DTE.