Hallo zusammen,
ich habe ein Problem mit dem Senden von Daten.
Ich möchte Daten durchgehend über uart an ein Funkmodul senden, welches
die Daten dann verschicken soll. Die Baudrate habe ich auf 115200
eingestellt; am Controller und Funkmodul natürlich. Ich werte ein CTS
Signal vom Funkmodul aus. Wenn dessen Buffer weniger als 17 Byte frei
hat, geht das Signal auf HIGH , wenn mehr als 34Byte frei sind, geht es
auf LOW. Ich sende dann nur, wenn das Signal LOW ist. Allerdings hängt
sich das Funkmodul scheinbar immer auf, weil der Buffer überläuft, wobei
ich das doch mit der CTS-Abfrage eigentlich verhindern will.
Mich würd nun interessieren, ob jemand eine Idee hätte, woran das liegen
könnte.
Wenn ich die Daten in nicht so schneller Folge sende, funktioniert es
komischerweise wunderbar.
Der CTS-Port des Funkmoduls toggelt auch immer, schön zu sehen am Oszi.
Ich habe hier einmal Stücke aus meinem Code. Ich hoffe, das da das
wichtigste dabei ist.
Mit der folgenden Funktion sende ich die Daten:
1
voidSendUSART0(char*str)// Einen String über die serielle Schnittstelle
2
{// (USART0) senden
3
while(*str!=0)
4
{
5
// Warten, bis USART0 TX-buffer sendebereit
6
while((!(IFG1&UTXIFG0))&&((P3IN&0x02)==0));
7
TXBUF0=*str++;
8
}
9
}/* void SendUSART0(char* str) */
Die Funktion wird in der main() in einer endlosschleife einfach immer
wieder aufgerufen. Ich sende da immer einfach 0xFF.
Das Folgende ist die Initialisierung der Schnittstelle
while ((!(IFG1 & UTXIFG0)) && ((P3IN & 0x02) == 0));
Das bedeutet doch, er soll warten, solange BEIDE Bedingungen erfüllt
sind. Wenn nur eine davon nicht erfüllt ist, gehts weiter. Also wenn der
TXBUF leer ist, sendet der schon wieder. Würd ich denken zumindest beim
schnellen hingucken jetzt.
while (!(IFG1 & UTXIFG0));
while((P3IN & 0x02) == 0);
wäre besser....denke ich :-)
Hmmm,
aus meiner Sicht ist die CTS-Logik in der Abfrage
while ((!(IFG1 & UTXIFG0)) && ((P3IN & 0x02) == 0));
verkehrt herum.
Du schreibst, dass Du die Übertragung anhalten willst, wenn das CTS 1
ist. Du hälst aber an, wenn es 0 ist. Meiner Meinung nach müsste der
Code
while ((!(IFG1 & UTXIFG0)) && ((P3IN & 0x02) == 1));
lauten.
Dann steigt die while Schleife aber trotzdem aus, sobald das UTXIFG0
gesetzt wird, denn dann ist die Bedingung nicht mehr erfüllt. Statt &&
müsste dann || rein.
Gesprochen dann: Solange der TXBUffer nicht geleert ist ODER solange CTS
auf 1 ist, warte.
Hallo zusammen,
erst einmal vielen Dank. Natürlich war die while-Schleife falsch.
Logischerweise muss sie ja so aus sehen:
1
while((!(IFG1&UTXIFG0))||((P3IN&0x02)==1));
Es soll ja in der Schleife verweilt werden, wenn die eine oder die
andere oder eben beide zusammen erfüllt sind.
Leider funktioniert es immer noch nicht, die übertragung geht ein paar
wenige Sekunden, dann bricht sie ab und ist erst nach Resetten des
Funkmoduls wieder
möglich.
Selbst wenn ich super langsam sende, also vielleicht nur ein, zwei oder
drei Datenpakete in der Sejunde hängt sich das Modul nach einiger Zeit
schon auf.
Jemand noch eine Idee, woran es noch liegen kann?
Grüße
Sven
Noch ein Nachtrag, bei einer Baudrate von z.b. 19200 geht das ganze ohne
Probleme, da kann ich die Daten so schnell senden, wie der
Mikrocontroller nur kann und das Modull rennt einfach durch.
Die Schleife is immer noch falsch:
((P3IN & 0x02) == 1));
ist immer false :-)
bitte in
while ((!(IFG1 & UTXIFG0)) || ((P3IN & 0x02) == 0x02));
ändern.
Vielleicht gehts dann besser