Xmega per Kommandozeile steuern

OP #2863544
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?
#2863879
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.
#2863886
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
OP #2872396
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.