Error al enviar datos a la placa de visualización LED desde un microcontrolador

Tengo una pantalla LED que tiene un conector RS232 para que podamos conectarla a nuestro sistema. La placa de visualización acepta cualquier dato que escribamos en el hiperterminal y lo muestra. Por ejemplo, si escribo Helloen terminal, se mostrará Hello.

Ahora tengo una placa de desarrollo AVR . He programado la MCU para transmitir Hellocon un retraso de 2 segundos. He conectado el cable RS232 de la placa de visualización a la placa de desarrollo AVR. Debería mostrar el Hellomensaje pero no muestra nada. He intentado incluir <cr><lf>también porque cuando presionamos enter en la hiperterminal, solo entonces acepta los datos. Pero todavía no se puede mostrar. ¿Alguna sugerencia de dónde me estoy perdiendo el punto?

CÓDIGO

void serial_Init()
{
UCSRB = (1<<TXEN) | (1<<RXEN);
UCSRC = (1<<UCSZ1)|(1<<UCSZ0)|(1<<URSEL);
UBRRL = 51;

}
void serial_Tx(char *str)
{
for (unsigned int i=0;str[i]!=0;i++)
{
    UDR=str[i];
    while(!(UCSRA&(1<<UDRE)));

}
}

int main()
{
serial_Init();
while(1)
{   

    {

        serial_Tx("HELLO");
        serial_Tx("0x0D");
        serial_Tx("0x0A");
    }

    }

}
¿La placa AVR tiene un controlador RS232 como MAX232? ¿Ha hecho coincidir la velocidad en baudios y otras configuraciones, como la paridad y la cantidad de bits de parada? Vea si el hiperterminal puede recibir datos de su placa AVR. También asegúrese de haber inicializado correctamente las comunicaciones seriales del AVR: pines del puerto, etc.
¿Has probado primero con la opción de bucle invertido? ¿TX de AVR->RX de AVR?
La placa de desarrollo @Zola Spehro Pefhany AVR funciona bien. Lo he probado con muchos otros módulos y siempre obtengo datos en la terminal. Tiene MAX232
¿Qué protocolo usa esa pantalla para comunicarse con la unidad de control?
No tiene ningún protocolo. Cuando envío los datos desde la PC en serie (a través de una hiperterminal), funciona pero no funciona con el controlador.
Intente incluir \x0D & \x0A en lugar de <cr><lf>
@Zola He intentado esto pero aún no funciona
Código postal por favor.
@Zola He publicado mi código.
En mi experiencia, el 90% de todos los problemas relacionados con RS-232 provienen de mezclar líneas Rx y Tx (ley de Murphy). Siempre es lo primero que hay que comprobar. También asegúrese de que haya una señal a tierra conectada a la placa.
¿Hay algún control de flujo en la pantalla? ¿Qué hipertérmino puede y su placa de desarrollo no? (Como rts cts etc...)
@MertGülsoy No tengo idea sobre el control de flujo en pantalla. Abrí la cubierta del cable RS232, solo se conectaron rx tx gnd, por lo que no creo que se requieran rts cts.

Respuestas (2)

Lo primero que hay que comprobar es la velocidad en baudios.

Si cree que la velocidad en baudios es correcta, mire la línea serial con un osciloscopio. La PC le brinda el caso de trabajo conocido, que compara con el caso de no trabajo.

Esto es solo una depuración básica.

Baudrate es correcto, pero no te entendí look at the serial line with a scope.
@CZAbhinav Mire la señal con un osciloscopio y verifique que esté emitiendo y que sea correcta.
@CZAbhinav Y si no miró la señal con un osciloscopio, ¿cómo puede saber que la velocidad en baudios es correcta? Configurar la tasa de baudios en el hardware UART del microcontrolador no siempre es una tarea trivial.
@Lundin, puedo decir que la velocidad en baudios es correcta porque estaba recibiendo los datos en la terminal.
@CZAbhinav "Debería mostrar el mensaje Hola pero no muestra nada". sugiere lo contrario. Si está recibiendo datos, ¿cuál es el problema?
@Lundin Probé mi código conectando el cable RS232 a mi PC, y estaba recibiendo datos, pero cuando conecté el cable RS232 de la placa de visualización a mi dev. tablero, no apareció nada.!

Si el código que ha publicado es correcto, aquí están los errores:

1) La función void serial_Tx(char *str)acepta char *y la llamas 3 veces con:

    serial_Tx("HELLO");
    serial_Tx("0x0D");
    serial_Tx("0x0A");

en este caso, mcu envía estos bytes a través de la línea serial con los números de secuencia (primera línea):

                            1 2
secuencia: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
primero: HOLA 0 x 0 D 0 x 0 A
segundo: HOLA 0d0a

como puede ver, el (mensaje único) tiene un tamaño de 13 bytes y no hay cr lf en él. Si la pantalla confirma el mensaje al recibir cr+lf, es normal que no muestre nada.

En la segunda línea pongo el mensaje con cr+lf por lo que el tamaño del mensaje es de 7 bytes.

Entonces el código debería ser:serial_Tx("HELLO\r\n");

2) El código de transmisión está en un ciclo while sin fin. ¡Entonces mcu nunca deja de enviar datos! Si con este código, conecta su mcu a su PC y abre HYPERTERM, observará que su HYPERTERM y uart se bloquearán debido a la inundación.

Entonces el código debería ser:

int main() {
    serial_Init();

    serial_Tx("HELLO\r\n");

    while(1) {  }    
}
He intentado enviar serial_Tx("HELLO\r\n");, nada parece funcionar. Pero su segundo punto parece interesante porque estoy incluido serial_Tx("HELLO\r\n");en while (1) que lo envía continuamente y puede ser que el tablero de visualización lo acepte solo una vez. Definitivamente lo probaré antes while(1). Gracias.!