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.