Ich habe ein LED-Display mit einem RS232-Anschluss, damit wir es an unser System anschließen können. Die Anzeigetafel akzeptiert alle Daten, die wir in das Hyperterminal eingeben, und zeigt sie an. Wenn ich zB Hello
Terminal eingebe, wird Hello
.
Jetzt habe ich ein AVR-Entwicklungsboard . Ich habe die MCU so programmiert, dass sie mit einer Verzögerung von 2 Sekunden sendet Hello
. Ich habe das RS232-Kabel der Anzeigeplatine an die AVR-Entwicklungsplatine angeschlossen. Es sollte die Hello
Nachricht anzeigen, aber es zeigt nichts an. Ich habe es <cr><lf>
auch versucht, denn wenn wir am Hyperterminal die Eingabetaste drücken, akzeptiert es nur dann die Daten. Kann aber immer noch nicht angezeigt werden. Irgendwelche Vorschläge, wo ich den Punkt übersehe?
CODE
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");
}
}
}
Das erste, was zu überprüfen ist, ist die Baudrate.
Wenn Sie der Meinung sind, dass die Baudrate stimmt, schauen Sie sich die serielle Leitung mit einem Oszilloskop an. Der PC gibt Ihnen den bekannten Arbeitsfall, den Sie mit dem Nichtarbeitsfall vergleichen.
Dies ist nur grundlegendes Debuggen.
look at the serial line with a scope
?Wenn der von Ihnen gepostete Code korrekt ist, sind hier die Fehler:
1) Die Funktion void serial_Tx(char *str)
akzeptiert char *
und Sie rufen sie 3 Mal auf mit:
serial_Tx("HELLO");
serial_Tx("0x0D");
serial_Tx("0x0A");
In diesem Fall sendet mcu diese Bytes über die serielle Leitung mit den Sequenznummern (1. Zeile):
1 2 Folge: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 zuerst: HALLO 0 x 0 D 0 x 0 A Zweitens: HALLO 0d0a
Wie Sie sehen, beträgt die (einzelne Nachricht) Größe 13 Bytes und es ist kein cr lf darin. Wenn das Display beim Empfang von cr+lf eine Nachricht festschreibt, ist es normal, dass nichts angezeigt wird.
In die zweite Zeile füge ich die Nachricht mit cr+lf ein, somit beträgt die Nachrichtengröße 7 Bytes.
Der Code sollte also lauten:serial_Tx("HELLO\r\n");
2) Der Sendecode befindet sich in einer endlosen While-Schleife. mcu hört also nie auf, Daten zu senden! Wenn Sie mit diesem Code Ihre mcu an Ihren PC anschließen und HYPERTERM öffnen, werden Sie feststellen, dass Ihr HYPERTERM und uart wegen Überschwemmung gesperrt werden.
Der Code sollte also lauten:
int main() {
serial_Init();
serial_Tx("HELLO\r\n");
while(1) { }
}
serial_Tx("HELLO\r\n");
, nichts scheint zu funktionieren. Aber Ihr zweiter Punkt sieht interessant aus, weil ich in while (1) einschließe, serial_Tx("HELLO\r\n");
das es kontinuierlich sendet und möglicherweise nur einmal von der Anzeigetafel akzeptiert wird. Ich werde es auf jeden Fall vorher ausprobieren (1). Danke.!
Spehro Pefhany
Laki
Flugzeug
Laki
Flugzeug
Laki
Flugzeug
Laki
Flugzeug
Lundin
Mert Gülsoy
Flugzeug