Asuros SerWrite(..) - Verständnisproblem
Guten Abend allerseits,
ich hab' heut mal ein bisschen in die Funktion SerWrite der asuro.c 'reingeguckt:
Code:
/* function for serial communication */
void SerWrite(unsigned char *data,unsigned char length)
{
unsigned char i = 0;
UCSRB = 0x08; // enable transmitter
while (length > 0) {
if (UCSRA & 0x20) { // wait for empty transmit buffer
UDR = data[i++];
length --;
}
}
while (!(UCSRA & 0x40));
for (i = 0; i < 0xFE; i++)
for(length = 0; length < 0xFE; length++);
}
Kann mir jemand den Sinn der letzten beiden Zeilen der Funktion erklären?
Was ich noch verstehe: alle Zeichen werden erfolgreich gesendet, und der ATmega meldet schließlich "Transmit Complete" (UCSRA wird = 0x40).
Was ich nicht verstehe: anschließend wird noch einmal i von 0 bis 0xFE durchlaufen und unterlagert length von 0 bis 0xFE. Dabei wird aber keinerlei Aktion ausgeführt; und da beide eh' nur lokale Variable bzw. lokale Kopie eines Argumentes sind, werden sie auch nicht beeinflusst.
Was ich gern wüsste: warum das, übersehe ich was? Was macht da der Compiler draus, wird sowas wegoptimiert (zumindest sofern ich nix übersehen habe...)?
Interessant fand ich, dass der Prozessor sich beim Schreiben auf die serielle Schnittstelle tatsächlich ausschließlich auf das Senden "konzentriert", während nebenher z. B. die Motoren und irgendwelche Regler laufen. Wenn Zeit also knapp ist, besser keine oder nur ganz kurze Ausgaben über die serielle Schnittstelle - oder gibts andere Trix, die ich nicht kenne?
Schlaut mich bitte auf!
Gruß,
Rakke
Liste der Anhänge anzeigen (Anzahl: 1)
@dgrobot
Ja, du hast absolut Recht mit deiner Vermutung das da ein Speicherbereich zu klein ist.
P.S.: Der Sendebuffer ist in der Datei asuro_st.h am Ende mit #define UART_TX_BUF_LEN 50 nicht auf 30 Zeichen, sondern auf 50 angegeben.
(Im übrigen ist dein angegeben Code für die Tastenabfrage für Testzwecke tatsächlich der sichere. Für eine echte Tastenabfrage vor einer 'angerumsten' Wand müsstest du dann aber ALLE Kombinationen der Tastewerte in einem Case abfragen.)
Es liegt aber nicht an dem Sendebuffer mit seiner begrenzten Länge, sondern an meinem eigenen Testprogramm.
Dort ist die Variable v_text mit 100 Zeichen definiert und ich Trottel schreibe beim Testfall auf Taste 6 102 Zeichen in diese Variable.
Nun also im Anhang eine korrigiert UND MIT WINNE-CODE VERSCHMOLZENE funktionsfähige Version. Kommentar wie gehabt in den Sourcen (Kopf und Funktion)
Ich hoffe ihr schaut alle nochmal genau nach was ich diesmal kaputt gemacht habe. ;-)
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat von Sternthaler
... hoffe ihr schaut alle nochmal genau nach was ich diesmal kaputt gemacht habe. ;-)
Ist ja schon eine Weile her - aber es hat mir keine Ruhe gelassen.
Ich habe die serielle IO jetzt komplett mit Interrupt zum laufen bekomme. O:)
In der asuro.c habe ich mal eine Debug-Anzeige stehen gelassen.
Code:
BackLED((tx_aktiv) ? ON : OFF, (rx_aktiv) ? ON : OFF); //Debug Debug Debug Debug Debug Debug
Da kann man sehen wie ich das Problem mit dem Empfang der selbt gesendeten Zeichen gelöst habe.