PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Über Uart Kommandos auswerten



daniel.weber
30.03.2011, 11:58
Hallo zusammen,

ich bin derzeit damit beschäftigt ein kleines "Protokoll" zu schreiben, das es mir ermöglicht über RS232 Schnittstelle Befehle an den Mikrocontroller zu senden.

Ein Befehl hat derzeit die Form: c123;
Das abschließende Zeichen ist also ';'
Es soll später einmal ein Wert auf den integer Wert '123' gesetzt werden.

Ich habe mir gedacht gut, ich mache mir einen kleinen Buffer und zähle die aktuelle Position mit, das funktioniert soweit auch ganz gut, nur treten seltsame Dinge auf. Zum einen werden einige Ausgaben mehrfach ausgegeben und sobald ich eine Eingabe gemacht habe und er mir das Ergebnis angezeigt hat, funktionieren weitere Ausgaben nicht mehr. Es kommt nur noch "Befehl wurde abgeschlossen".

Bin da so langsam mit meinem Latein am Ende, vielleicht entdeckt ihr ja den Denkfehler.
Ich verwende die Uart Lib von Peter Fleury.


#define BUFFER_SIZE 128

unsigned char buffer[BUFFER_SIZE];
unsigned char buffer_temp[BUFFER_SIZE];
unsigned char buff_ptr = 0;

while(1) {
c = uart_getc();
if (c & UART_NO_DATA)
{


}
else
{

buffer[buff_ptr] = (unsigned char)c;
if (++buff_ptr >= BUFFER_SIZE)
{
buff_ptr = 0;
}

if (buffer[buff_ptr-1] == ';')
{
uart_puts("Befehl wurde abgeschlossen \n");
uart_puts("Buffer Zaehler: ");
uart_puts(itoa( buff_ptr, s, 10));
uart_puts("\n");
// Buffer kopieren
for (int i=0; i < BUFFER_SIZE; i++)
{
buffer_temp[i] = buffer[i];
}

// Kommando auswerten
if (buffer_temp[0] == 'c')
{
char iTemp[3];
// Zalen auslesen
for (int i=0; i<3; i++)
{
iTemp[i] = buffer_temp[i+1];
}
int a;
a = atoi(iTemp);
uart_puts("Zahlenwert lautet: ");
uart_puts(itoa( a, s, 10));
uart_puts("\n");
}
// Buffer löschen
buff_ptr = 0;
for (int i=0; i < BUFFER_SIZE; i++)
{
buffer[i] = 0;
}
}
}
}

sternst
30.03.2011, 14:07
Wie machst du die Eingaben, mit einem Terminal-Programm? Schließt du dort die Eingabe mit <Return> ab? Dann wäre dieses
sobald ich eine Eingabe gemacht habe und er mir das Ergebnis angezeigt hat, funktionieren weitere Ausgaben nicht mehr. Es kommt nur noch "Befehl wurde abgeschlossen".schon mal nachvollziehbar.

Aber was meinst du hiermit:

Zum einen werden einige Ausgaben mehrfach ausgegebenWas genau wird wann mehrfach ausgegeben?

PS: Der doppelte Puffer macht hier keinen Sinn. Wozu soll der gut sein?

daniel.weber
30.03.2011, 15:00
Hallo Stefan,

die Eingabe wird durch ein Enter abgeschlossen (C# mit WriteLine()).

Wenn ich als Bsp. "c123;" eingebe, dann bekomme ich im Terminal folgende Ausgabe


Befehl wurde abgeschlossen
Befehl wurde abgeschlossen
Buffer Zaehler: 6
Befehl wurde abgeschlossen
Buffer Zaehler: 6
Zahlenwert lautet: 123
der doppelte Buffer sollte den Sinn haben, falls neue Zeichen eingehen während die Verarbeitung läuft, der Buffer nicht zerschossen wird aber du hast recht, kann ja gar nicht passieren. Somit ist der doppelte Buffer tatsächlich Unsinn.


Edit:
So habe das mal im Terminal Programm unter C# mit der Funktion Write() versucht, das funktioniert einwandfrei.