Forum: Mikrocontroller und Digitale Elektronik Xmega per Kommandozeile steuern


von I. E. (anfaenger69)


Lesenswert?

Ich möchte meinem Xmega per Kommandozeile über den USART steuern

z.B. PORT C PIN 1 HIGH (Return)

Dafür müsste ich vermutlich einen Puffer füllen.

Ich stelle mir vor dass ich eine Varibale deklariere:
1
uint8_t RX_Buff[40];
2
uint8_t RX_Buff_Endmarke = 0;

und jedes mal, wenn ein neues Zeichen kommt, diesen Buffer erhöhe:
1
RX_Buff_Endmarke = RX_Buff_Endmarke + 1;
2
RX_Buff[RX_Buff_Endmarke] = USARTC0.DATA;

Das kann meinetwegen im Interrupt passieren...

Bin ich auf dem richtigen Weg?
Oder kennt jemand einen fertigen Beispielcode?

von Karl H. (kbuchegg)


Lesenswert?

Igor Ebner schrieb:

> Bin ich auf dem richtigen Weg?

Sagen wir mal so.
Auf dem Weg von München nach Oslo hast du gerade die Garage erfolgreich 
verlassen.

Weiter so. Aber bitte nicht wegen jedem 2-Zeiler hier nachfragen. 
Überleg dir, wie du die nächste Programmetappe testen kannst und dann 
teste das was du gerade neues dazugeschrieben hast.
Programmieren ist wie radfahren. Wir können dir 100 mal sagen, was gut 
und was schlecht ist, aber du musst es auch selber tun und du musst auch 
auf die Schnauze fallen um es zu lernen.

von Alex S. (thor368)


Lesenswert?

Wobei du bitte erst die Daten schreibst und dann den Zeiger 
inkrementierst.

Lass dich nicht entmutigen. Eine kleine Komandozeile zu basteln ist 
nicht schwer. Das Hauptproblem ist tatsächlich die stringverarbeitung. 
Damit meine ich weniger den Programieraufwand als dass einem bei strings 
sehr schnell der Speichern ausgehen kann.

Thor

von I. E. (anfaenger69)


Lesenswert?

Genau da hänge ich nun seit einer Weile:

Ich kann die Kommandozeile ja auf verschiedene Arten deklarieren bzw 
ablegen:

einmal so:
char *RX_Buff;
char *vergleichsstring = {"blau"};

in der Empfangsroutine dann:
*RX_Buff++ = USARTC0.DATA;

In der Auswertung dann so:
if (!memcmp(*RX_Buff, *vergleichsstring)){
send_uart0("Blau erkannt");
}



oder so:
char RX_Buff[50];

in der Empfangsroutine dann:
RX_Buff[RX_Buff_Endmarke) = USARTC0.DATA;
RX_Buff_Endmarke++

Im oberen Fall scheiterte es am memcmp, da *RX_Buff das Ende des 
abgelegten Strings anzeigt und *vergleichsstring den Anfang des 
abgelegten Vergleichsstrings zeigt.

Im unteren Fall weiss ich noch nicht, wie ich den Vergleich anstellen 
soll, weil memcmp kann ich ja nicht verwenden, da die Variable 
RX_Buff[i] ja nicht auf einen Speicher zeigt.

Wie wäre der eleganteste Lösungsansatz?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.