Parameter übergeben ?

Hi,
ich bin absoluter Neuling was den Arduino angeht.
Ist ja ein tolles Teil :slight_smile:

Nun mal zu meinem Problem.
Ich möchte dem Arduino Parameter über usb übergeben.
Mit einzelnen Zeichen klappt das ja wunderbar mit serial.read().

Aber wie kann ich folgende Parameter übergeben.
Die Syntax ist:
LA22, 123, 17, 12

Die Parameter sollen nach dem einlesen den entsprechenden
Variablen zugewiesen werden.
LA=LA22
HC=123
AD=17
CM=12

Ich fange auch gerade erst an "c" zu lernen, also bitte habt
etwas Nachsicht.

Danke
vobie

Fäng die Zeile immer mit "LA" an?
Wie groß können die einzelnen Zahlen werden? Auch negativ?

hi,

Nein, die Parameter fangen nicht immer mit LA.. an.
Die Anzahl der Zeichen ist auf Maximal 40 beschränkt.
Darin sind auch das Trennzeichen "," und "\0" enthalten.

Ich denke das es mit einem Array das an eine Funktion übergeben wird funktionieren sollte.
Bin aber noch am suchen im I-Net.

vobie

Naja, im einfachsten Fall könntest Du ein char[]-Puffer mit 40 Zeichen anlegen und eine int-variable für die Position im Puffer.

Wenn dann was am seriellen Port anliegt liest Du das an die nächste freie Stelle im Puffer (z.B. mit "buffer[bufferpos++]=serial.read()" oder so ähnlich).

Wenn dann eine "\0" gelesen wird bist Du am Ende Deines Befehls angelangt und kannst mit der Verarbeitung beginnen.
Vergiss dabei nicht, die Pufferposition zurückzusetzen!

Dazu würde ich den Puffer durchgehen und nach den Kommas suchen...
A la "if (buffer[t]==',') " oder so.

Und dann kannst Du an den entsprechenden Stellen mit "atoi" ansetzen und die Zahlen-Zeichen in echte Zahlen umwandeln.

Oder was in der Art...

Wenn Du mal genau aufschreiben würdest, welche Werte die einzelnen Inhalte annehmen können und was sie bewirken sollen (vor allem die Buchstabenkomponenten), könnte man etwas konkreter werden... :wink:

Wie passt Arduino Playground - Messenger?
Udo

hi,

so, ich habe da was gefunden verstehe es aber noch nicht 100% was da abläuft. (bin immer noch "C" anfänger !).
Ich habe den code auch ausprobiert, funktioniert soweit
Aber ich würde ihn auch gerne verstehen.
Vielleicht könnte jemand die // ? auflösen.

Code
...
static byte wert, eingabe[25], i; // variable und array initialisieren
....
static void test(word var1, byte var2, byte cmd) { // Funktion test definieren
....
}

// Input Funktion
static void Input (char c) { //Funktion Input
if ('0' <= c && c <= '9') // Zeichen auswerten ?
wert = 10 * wert + c - '0'; // ?
else if (c == ',') { // Wenn Zeichen "," dann... ?
if (i < sizeof eingabe) // ?
eingabe[i++] = wert; // ?
wert = 0;
} else if ('a' <= c && c <='z') { // Zeichen auswerten ?
switch (c) { // Auswahl
...................
...................
case 'f': // Wenn f dann Funktion test
test(256 * eingabe[0], eingabe[1], wert); // ?
break;
.................
.................
}
wert = i = 0; // ?
memset(eingabe, 0, sizeof eingabe); //?

...
...
void loop() {
if (Serial.available())
Input(Serial.read()); // Zeichen von usb an die Input funktion
....
....

danke
vobie

   } else if ('a' <= c && c <='z') {  // ?

Funktioniert aber auch wirklich nur mit Kleinbuchstaben! Absicht?

wert = i = 0;  // ?

Setzt den Wert von "wert" bei jedem eingegebenen Zeichen zurück. Damit können nur Werte bis maximal "9" erreicht werden! Besser das nur ein Mal in der "init" machen und ansonsten zurücksetzen, wenn ein Wert verarbeitet wird...

Input(Serial.read()); // Zeichen von usb an die Input funktion

Funktionen werden in der Regel klein geschrieben, nur Objektklassen schreibt man vorne groß. Und Konstanten komplett groß. :wink:

auf "} else if ('a' <= c && c <='z') { // ?" und " case 'f': " würde ich auch verzichten, und gleich nach der Parameter Eingabe die Funktion test ausführen.
Aber wie mach ich das ?
Kommentiere ich das aus funktioniert der code nicht.

Was macht eigentlich die Multiplikation mit 256 in test(256 * eingabe[0], eingabe[1], wert); ?

"... Damit können nur Werte bis maximal "9" erreicht werden! Besser das nur ein Mal in der "init" machen und ansonsten zurücksetzen, wenn ein Wert verarbeitet wird..."

Bitte etwas genauer für einen C Neuling

danke
vobie

Probier mal irgendwas in der Richtung:

byte wert;
int welche;
int zahl[4];

void test() {
      // Hier kommt man nur rein, wenn eine Zeile zu Ende ist,
      // dann sollte ein kompletter Datensatz empfangen worden sein.
      // Die vier empfangenen Zahlen stehen dann in "zahl[0]", "zahl[1]", "zahl[2]" und "zahl[3]".
}

void input (char c) {
   if ('0' <= c && c <= '9') {
       wert = 10 * wert + c - '0';
   } else if (c == ',' || c == '\0') {
      zahl[welche++] = wert;
      wert = 0; // zuruecksetzen
      if (c == '\0') { // Zeilenende
            welche = 0; // Naechstes Mal wieder vorne im Array anfangen
            test(); // Und die Verarbeitungsfunktion aufrufen...
      }
   } else {
         // Hier kommt er rein, wenn ein Buchstabe dran ist.
         // Was dann zu Tun ist kommt drauf an was Du machen willst und welche Werte kommen koennen.
   }
}

void init() {
      wert = welche = 0;  // Setzt alle Variablen auf einen definierten Startwert
}

void loop() {
   if (Serial.available())
       input(Serial.read()); // Zeichen von USB an die input-Funktion uebergeben
}

Ist aber ein Schnellschuss in nem Texteditor, kann das hier in der Firma nicht compilieren.

Und um das zu verfeinern müsste man wirklich wissen, was Du da für Werte bekommen kannst und was Du damit anfangen willst... :wink:

Danke

Probiere ich heute Abend gleich mal aus !

vobie