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 Hello
en terminal, se mostrará Hello
.
Ahora tengo una placa de desarrollo AVR . He programado la MCU para transmitir Hello
con 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 Hello
mensaje 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");
}
}
}
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.
look at the serial line with a scope
.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) { }
}
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.!
Spehro Pefhany
Laki
Aeronave
Laki
Aeronave
Laki
Aeronave
Laki
Aeronave
Lundin
Mert Gülsoy
Aeronave