PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : M128 - Lesen von UART



Fabian E.
24.05.2010, 14:54
Hallo,
so langsam nimmt mein Programm für die M128 Gestalt an, jetzt hapert es aber ein wenig am Lesen der über UART an den Roboter gesendeten Befehle.

Hier erst mal ein wenig Code:

void task_Commands(void)
{
unsigned char tmp;
tmp = Serial_ReadExt(0);
if(tmp != 0)
{
clearLCD();
setCursorPosLCD(0,0);
writeStringLCD("Char: ");
writeCharLCD(tmp);
if (tmp =='#')
{
Thread_Delay(1);
counter = 0;
}
text[counter] = tmp;
//text[counter + 1] = '\0';
counter++;
//clearPosLCD(1,0,15);
setCursorPosLCD(1,0);
writeStringLCD(text);
}

Wie man hier sieht, wird immer ein Zeichen eingelesen, überprüft ob es gültig ist (Str_ReadExt liefert eine 0 wenn kein Zeichen vorhanden ist) und dann dem Text empfangener Zeichen hinzugefügt. Sonderfall: es handelt sich um ein '#', dies ist das Startzeichen eines Befehls. Also wird bei diesem Fall von vorne angefangen. Zwischen drin lasse ich mir noch über das LCD ein paar Debug-Sachen ausgeben: Das aktuell empfangene Zeichen und den gesamten Text.
Das einzelne Zeichen klappt auch super, es wird immer korrekt angezeigt.
Allerdings hat er ein Problem damit mehr als 4 Zeichen auf einmal zu empfangen...
Hier mal eine kleine Tabelle was ich sende und was im Endeffekt ankommt:


Gesendet Empfangen
123 123
1234 1234
12345 1235
123456789 1239
#1:123:123* #1:* --> Das hier wäre ein richtiger Befehl, wie der Roboter ihn gesendet bekommen würde.

Das heißt, er empfängt immer die ersten drei und das letzte Zeichen. Alles andere ignoriert er.
Hat er vielleicht nur einen Buffer für 4 Zeichen oder so? Weil die Zeichen werden ja alle auf einmal gesendet.

Ich habe auf der etwas dürftigen Seite von der C-Control das hier gefunden:http://www.c-control-pro.de/documentation/serial_init_irq.htm

Das sieht ja irgendwie nach dem Richtigen aus... Aber das klappt so leider auch noch nicht...

Kann mir jemand helfen?

Dirk
24.05.2010, 19:02
@Fabian E.:
Versuch doch 'mal, die einzelnen Zeichen mit einer kleinen Verzögerung zu senden.

Gruß Dirk

Fabian E.
24.05.2010, 19:55
Ja, es halt darum den ganzen String zu senden... Konkret z.B.: "#1:100:100:0*". Wenn ich da alle Zeichen einzeln sende kommt alles an und wird auf dem Roboter auch korrekt ausgewertet und auf dem Display angezeigt.
Nur überträgt/liest er halt nicht mehr als vier Zeichen auf einmal.
Im Prinzip könnte ich es auch mit mehren "Blöcken" machen, aber eigentlich wäre das gepfuscht und das will ich ja nicht.

Fabian E.
27.05.2010, 16:49
Keiner eine Idee? Können andere Besitzer einer M128 vielleicht mal dieses Verhalten testen? Ist das bei euch genauso?
Ich würde äußerst ungerne mein PC-Programm umschreiben, damit es maximal 4 Zeichen aufeinmal sendet. Das wäre alles andere als schön...

SlyD
28.05.2010, 18:17
Hier:
http://www.c-control.de/c-control-pro/applikationen/original_demos_in_basic_und_c.html

Gibts Beispiele dazu (Ordner RS232). Du musst da nen Buffer beim serial_init zuweisen soweit ich mich erinnere.

Die aktuellen Versionen der CCPRO IDE ham die Beispiele scheinbar irgendwie nicht mehr mit dabei? Warum auch immer. Nunja.

MfG,
SlyD

Fabian E.
29.05.2010, 16:11
Okay, danke. Bei deinem Beispiel handelt es sich um Serial_Init_IRQ. Dabei kann man einen Buffer für Senden und Empfangen festlegen.

Allerdings kommt dann beim Senden am PC nur noch zerstückelter Datenmüll an... Ein paar Sachen stimmen, andere werden verdreht, vieles fehlt...
Das Empfangen allerdings klappt nun sehr gut, wenn auch recht langsam...
Jemand eine Idee?

SlyD
29.05.2010, 16:23
Ohne Quelltext kann man sowieso nix sagen ;)

Zur C-Control kannst Du übrigens besser in dem Forum hier:
http://ccpro.cc2net.de/forum/

fragen da sind mehr Leute dazu unterwegs.
Da gabs bestimmt auch schon Threads dazu also mal die SuFu dort benutzen.

MfG,
SlyD

Fabian E.
29.05.2010, 18:09
Okay vielen Dank, das Forum kannte ich noch nicht.
Ich habe jetzt festgestellt, dass UART zu langsam arbeitete um meinen gesamten Text zu senden, deswegen kam es zu einem Bufferoverflow.
Vergrößerung des Buffers hats dann gebracht.

Vielen Dank =)