Go Down

Topic: Parameter übergeben ? (Read 4595 times) previous topic - next topic

vobie

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

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


Joghurt

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

vobie

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

Joghurt

#3
Jun 08, 2010, 05:01 pm Last Edit: Jun 08, 2010, 05:04 pm by Joghurt Reason: 1
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... ;)

udoklein

Check out my experiments http://blog.blinkenlight.net

vobie

#5
Jun 10, 2010, 12:05 pm Last Edit: Jun 10, 2010, 12:24 pm by vobie Reason: 1
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

Joghurt

#6
Jun 10, 2010, 12:23 pm Last Edit: Jun 10, 2010, 12:23 pm by Joghurt Reason: 1
Code: [Select]
  } else if ('a' <= c && c <='z') {  // ?
Funktioniert aber auch wirklich nur mit Kleinbuchstaben! Absicht?

Code: [Select]
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...

Code: [Select]
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ß.  ;)

vobie

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







Joghurt

#8
Jun 10, 2010, 01:45 pm Last Edit: Jun 10, 2010, 01:47 pm by Joghurt Reason: 1
Probier mal irgendwas in der Richtung:
Code: [Select]
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...  ;)

vobie

Danke

Probiere ich heute Abend gleich mal aus !

vobie

Go Up