Hi zusammen, ich habe ein Problem mit dem UART meines MSP430. Ich habe ein Programm geschrieben was folgendes machen soll. -Daten vom PC empfangen -Wenn ein "Enter" gesendet wurde, die empfangenen Daten auf einem Display ausgeben -einen String als Kontrolle an den PC senden Auf dem PC habe ich Hyperterminal am laufen. Nun habe ich zwei Probleme. Problem 1: Es werden Daten empfangen und so lange in einem String gespeichert, bis ein Enter gedrückt wird. Das Enter ist dann das Zeichen, dass keine weiteren Daten mehr kommen und das empfangene auf dem Display ausgegeben werden kann. Daten empfangen und speichern geht, aber bei der Ausgabe stimmt was nicht. Es werden immer nur 6 Zeichen ausgegeben. Wenn ich z.B. "1235.678" sende, wird das auch gespeichert, im Debugger nachgeschaut. Sobald das dann aber auf dem Display ausgegeben werden soll, steht in dem String nur noch "12345.".Der Rest wird einfach abgeschnitten. Ich kann mir nur vorstellen, dass das an der Ausgabe liegt, aber ich finde den Fehler einfach nicht. Problem 2: Nachdem die Daten auf dem Display ausgegeben wurden, wenn auch verkürzt, soll ein String als Bestätigung an den PC gesendet werden. Das funktioniert leidernicht. Der Code bleibt immer in der Zeile while (!(IFG1 & UTXIFG0)); d.h. ja, dass der Sendebuffer nicht bereit ist, wenn ich das richtig verstanden habe, aber der müsste doch zumindest beim ersten mal leer sein. Ich steige nicht dahinter, woran es liegt. Ich habe mal ein Zip mit dem wichtigsten Code für Display, UART und das Main-Programm angehängt. Wäre klasse, wennn sich das vielleicht mal jemand anschauen und den fehler finden würde. Vielen Dank. Gruß Marco
> >while (!(IFG1 & UTXIFG0)); > nimm lieber: > while (!(U0TCTL & TXEPT)); Nein, das ist nicht das Problem. UTXIFGx ist schon das korrekte zu prüfende Flag. Wird TXEPT überprüft, dann ist nicht nur das Sendeschieberegister, sondern auch der Sendepuffer leer. Wird so gesendet, wird zwischen jedes übertragene Zeichen eine Zeichenzeit lang gewartet. Das ist aber nur bei sehr langsamen Gegenstellen nötig oder auch nur nützlich. Desweiteren werden Rx- und Tx-Interrupts aktiviert, es gibt aber nur einen Interrupthandler für den Rx-Interrupt. Der übrigens schreibt munter in ein irgendwo definiertes Array irgendeiner Größe, ohne daß eine Überprüfung des Arrayindexes auf Überlauf stattfindet. Wie groß ist out_str? Wie ist NextStr definiert?
Hallo, NextStr ist wie folgt definiert: unsigned char NextStr= 0; und out_str mit unsigned char out_str[]="0000"; > >while (!(IFG1 & UTXIFG0)); > nimm lieber: > while (!(U0TCTL & TXEPT)); Wenn ich das mache, wird das erste Zeichen meines Strings, welcher an den PC gesendet werden soll 2 mal gesendet und danach wird anscheinend ein Reset ausgeführt, denn das LCD steht dann wieder wie beim Programmstart vor dem ersten Senden und Empfangen von Daten. Deswegen hat es dann auch den Anschein, dass nix auf dem LCD angezeigt wird. Wenn man dann Schritt für Schritt durchgeht, sieht man, dass es angezeigt wird, dann wird was an den PC gesendet, aber falsch und dann resettet sich das ganze anscheinend.
Marco wrote: > Hallo, > > NextStr ist wie folgt definiert: > unsigned char NextStr= 0; OK > und out_str mit unsigned char out_str[]="0000"; Prima, da passen genau 4 Zeichen rein, wenn du mehr empfängst, bevor das Enter kommt, überschreibst du irgendetwas anderes im RAM. >> >while (!(IFG1 & UTXIFG0)); >> nimm lieber: >> while (!(U0TCTL & TXEPT)); while (!(IFG1 & UTXIFG0)); ist schon richtig, lass das drin. Achso, und lass den TX-Int aus: IE1 |= URXIE0;
Hallo, vielen Dank! > IE1 |= URXIE0; erledigt > out_str[]="0000"; wie dumm....kann man das auch auf unbestimmte größe definieren? Das Problem mit dem Senden von Nachrichten bleibt. der hängt immer in der Zeile while (!(IFG1 & UTXIFG0)); fest. Marco
Unbestimmte Größe geht so erst mal nicht. Schließlich muss der Compiler dir was reservieren im RAM. Du könntest natürlich die große Keule mit malloc() schwingen, macht aber keinen Sinn. Überleg doch mal, was maximal auf dein Display drauf geht, mehr brauchst du doch nicht.
Das stimmt natürlich...mehr als aufs Display passt ist ja auch Quatsch, bzw. Habe ich später ja auch nur eine begrenzte Menge, die empfangen wird. Hetzt stellt sich nur noch die Frage, warum das Ding einfach nicht senden will, bzw. immer in der Abfrage hängen bleibt. hat da noch jemand eine Idee? Vielen Dank!
Hallo, das mit dem Senden funktioniert nun auch. Ich weiß nicht so recht warum, ich habe die Initialisierung des UART nochmal kontrolliert und ein wenig rumprobiert, hinterher aber wieder alle Werte wie zuvor eingestellt, aber jetzt gehts. Ob da irgendwo ein Tipfehler war oder so!? Vielen Dank für die Hilfe! Marco
> hinterher aber wieder alle Werte wie zuvor eingestellt, Bei der UART des MSP430 ist auch die Reihenfolge entscheidend, in der Dinge eingestellt werden. Das steht aber im User's Manual.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.