Fehler beim Senden von Daten von einem Mikrocontroller an die LED-Anzeigetafel

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 HelloTerminal 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 HelloNachricht 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");
    }

    }

}
Hat das AVR-Board einen RS232-Treiber wie MAX232? Haben Sie die Baudrate und andere Einstellungen wie Parität und Anzahl der Stoppbits angepasst? Prüfen Sie, ob das Hyperterminal Daten von Ihrem AVR-Board empfangen kann. Stellen Sie außerdem sicher, dass Sie die serielle AVR-Kommunikation richtig initialisiert haben - Port-Pins usw.
Hast du es zuerst mit der Loopback-Option versucht? TX von AVR->RX von AVR?
@Zola Spehro Pefhany AVR-Entwicklungsboard funktioniert einwandfrei. Ich habe es mit vielen anderen Modulen getestet und bekomme immer Daten am Terminal. Es hat MAX232
Welches Protokoll verwendet dieses Display zur Kommunikation mit der Steuereinheit?
Es hat kein Protokoll. Wenn ich die Daten vom PC seriell (über Hyperterminal) sende, funktioniert es, aber nicht mit dem Controller.
Versuchen Sie, \x0D & \x0A anstelle von <cr><lf> einzuschließen
@Zola Ich habe das versucht, aber es funktioniert immer noch nicht
Postleitzahl bitte.
@Zola Ich habe meinen Code gepostet.
Meiner Erfahrung nach entstehen 90 % aller RS-232-bezogenen Probleme durch das Vertauschen von Rx- und Tx-Leitungen (Murphys Gesetz). Es ist immer das erste, was Sie überprüfen müssen. Stellen Sie außerdem sicher, dass eine Signalmasse mit der Platine verbunden ist.
Gibt es eine Flusskontrolle auf dem Display? Welcher Hyperterm kann und Ihr Entwicklungsboard nicht? (Wie rts cts etc ...)
@MertGülsoy Ich habe keine Ahnung von der angezeigten Flusskontrolle. Ich habe die Abdeckung des RS232-Kabels geöffnet, nur rx tx gnd waren verbunden, daher sind meiner Meinung nach keine rts cts erforderlich.!

Antworten (2)

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.

Die Baudrate ist korrekt, aber ich habe Sie nicht verstanden look at the serial line with a scope?
@CZAbhinav Betrachten Sie das Signal mit einem Oszilloskop und prüfen Sie, ob es ausgegeben wird und ob es korrekt ist.
@CZAbhinav Und wenn Sie das Signal nicht mit einem Oszilloskop betrachtet haben, wie können Sie dann feststellen, dass die Baudrate korrekt ist? Das Einrichten der Baudrate in der Mikrocontroller-UART-Hardware ist nicht immer eine triviale Aufgabe.
@Lundin Ich kann sagen, dass die Baudrate korrekt ist, weil ich die Daten am Terminal empfangen habe.
@CZAbhinav "Es sollte die Hallo-Nachricht anzeigen, aber es wird nichts angezeigt." schlägt etwas anderes vor. Wenn Sie Daten empfangen, wo liegt dann das Problem?
@Lundin Ich habe meinen Code getestet, indem ich das RS232-Kabel an meinen PC angeschlossen habe, und ich habe Daten empfangen, aber als ich das RS232-Kabel der Anzeigetafel an meinen Entwickler angeschlossen habe. Board, es wurde nichts angezeigt.!

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) {  }    
}
Ich habe versucht zu senden 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.!