String Funktionen

Hallo,
irgendwie scheinen die Daten, die in einem String (mit großem S) gespeichert werden wohl eine besondere Klasse zu sein. Ich verstehe nur nicht wie. Nachdem ich mich jetzt durch einiges durchgelesen habe, komme ich immer noch nicht weiter.
Ich wollte, vorerst zu Testzwecken, ein paar Leds ein und ausschalten. Zu diesem Zweck werden Befehle von einem kleinen Java-Programm via Ethernet an den Arduino uebergeben.
Der Befehl fuer Einschalten sieht dann so aus: setport21
Dabei ist die erste Zahl die Pinnummer und die zweite Zahl die Funktion (1 = Ein, 0 = Aus).
Nachfolgender Code funktioniert so wie er soll:

#include <SPI.h>
#include <Ethernet.h>

// network configuration.  gateway and subnet are optional.

 // the media access control (ethernet hardware) address for the shield:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x1D, 0x59 };  
//the IP address for the shield:
byte ip[] = { 192, 168, 123, 170 };    
// the router's gateway address:
byte gateway[] = { 192, 168, 123, 253 };
// the subnet:
byte subnet[] = { 255, 255, 255, 0 };

// server starten port 50290
EthernetServer server = EthernetServer(50290);

// String fuer die eingegebenen Daten
String Eingang;

void setup()
{
  // initialize the ethernet device
  Ethernet.begin(mac, ip, gateway, subnet);

  // start listening for clients
  server.begin();
}

void loop()
{
  // if an incoming client connects, there will be bytes available to read:
  EthernetClient client = server.available();
  while (client.available()) {
// Eingabe vom Client entgegen nehmen
// Ein Zeichen einlesen
    char einzel = client.read();
// Zeichenkette zusammensetzen
    Eingang += einzel;
  }
// Wenn digitale Ports geschaltet werden sollen (set)
    if (Eingang.substring(0,3) == "set"){
// Abtesten welcher Digital-Port gewuenscht wird (hier 2)      
      if (Eingang.substring(7,9) == "21"){
// Port als Ausgang schalten        
          pinMode(2, OUTPUT);  
// Einschalten          
          digitalWrite(2, HIGH);
      }
      else if (Eingang.substring(7,9) == "31"){
          pinMode(3, OUTPUT);  
          digitalWrite(3, HIGH);
      }
      else if (Eingang.substring(7,9) == "41"){
          pinMode(4, OUTPUT);  
          digitalWrite(4, HIGH);
      }
      else if (Eingang.substring(7,9) == "51"){
          pinMode(5, OUTPUT);  
          digitalWrite(5, HIGH);
      }
      else if (Eingang.substring(7,9) == "61"){
          pinMode(6, OUTPUT);  
          digitalWrite(6, HIGH);
      }
      else if (Eingang.substring(7,9) == "71"){
          pinMode(7, OUTPUT);  
          digitalWrite(7, HIGH);
      }
      else if (Eingang.substring(7,9) == "81"){
          pinMode(8, OUTPUT);  
          digitalWrite(8, HIGH);
      }
      else if (Eingang.substring(7,9) == "91"){
          pinMode(9, OUTPUT);  
          digitalWrite(9, HIGH);
      }

// Abtesten welcher Digital-Port gewuenscht wird (hier 2)      
      if (Eingang.substring(7,9) == "20"){
// Port als Ausgang schalten        
          pinMode(2, OUTPUT);  
// Ausschalten          
          digitalWrite(2, LOW);
      }
      else if (Eingang.substring(7,9) == "30"){
          pinMode(3, OUTPUT);  
          digitalWrite(3, LOW);
      }
      else if (Eingang.substring(7,9) == "40"){
          pinMode(4, OUTPUT);  
          digitalWrite(4, LOW);
      }
      else if (Eingang.substring(7,9) == "50"){
          pinMode(5, OUTPUT);  
          digitalWrite(5, LOW);
      }
      else if (Eingang.substring(7,9) == "60"){
          pinMode(6, OUTPUT);  
          digitalWrite(6, LOW);
      }
      else if (Eingang.substring(7,9) == "70"){
          pinMode(7, OUTPUT);  
          digitalWrite(7, LOW);
      }
      else if (Eingang.substring(7,9) == "80"){
          pinMode(8, OUTPUT);  
          digitalWrite(8, LOW);
      }
      else if (Eingang.substring(7,9) == "90"){
          pinMode(9, OUTPUT);  
          digitalWrite(9, LOW);
      }
     }
    Eingang ="";
}

Nun habe ich versucht das Ganze etwas kuerzer zu schreiben:

#include <SPI.h>
#include <Ethernet.h>

// network configuration.  gateway and subnet are optional.

 // the media access control (ethernet hardware) address for the shield:
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x1D, 0x59 };  
//the IP address for the shield:
byte ip[] = { 192, 168, 123, 170 };    
// the router's gateway address:
byte gateway[] = { 192, 168, 123, 253 };
// the subnet:
byte subnet[] = { 255, 255, 255, 0 };

// server starten port 50290
EthernetServer server = EthernetServer(50290);

// String fuer die eingegebenen Daten
String Eingang;

void setup()
{
  // initialize the ethernet device
  Ethernet.begin(mac, ip, gateway, subnet);

  // start listening for clients
  server.begin();
}

void loop()
{
  // if an incoming client connects, there will be bytes available to read:
  EthernetClient client = server.available();
  while (client.available()) {
// Eingabe vom Client entgegen nehmen
// Ein Zeichen einlesen
    char einzel = client.read();
// Zeichenkette zusammensetzen
    Eingang += einzel;
  }
// Wenn digitale Ports geschaltet werden sollen (set)
        if (Eingang.substring(0,3) == "set" && Eingang.substring(7,8) == "1"){
// Port als Ausgang schalten        
          pinMode(int(Eingang.substring(7,8)), OUTPUT);  
// Einschalten          
          digitalWrite(int(Eingang.substring(7,8)), HIGH);
        }
    Eingang ="";
}

Hier bekomme ich bei der Zeile:

pinMode(int(Eingang.substring(7,8)), OUTPUT);

den Fehler "invalid cast from type 'String' to type 'int'".
Irgendwie passen die Datentypen, trotz versuchter Konvertierung, nicht zusammen.
Kann mir da jemand helfen

Gruß
Christoph

Hi,

du musst den String zuerst in einen Char-String umwandeln und dann in einen Integer.

hi, mx55

int derPin;
char carray[1];
.
.
// Wenn digitale Ports geschaltet werden sollen (set)
        if (Eingang.substring(0,3) == "set" && Eingang.substring(7,8) == "1"){
            Eingang.substring(7,8).toCharArray(carray, 1);
            derPin = atoi(carray);
// Port als Ausgang schalten 
          pinMode(derPin, OUTPUT);  
// Einschalten          
          digitalWrite(derPin, HIGH);
        }

funkt bei mir beim kompilieren, will jetzt keinen arduino anhängen, ich geh' schlafen...

gute nacht, stefan

Hallo,

danke fuer deine Hilfe.
Die Funktion atoi() habe ich in der Arduino Sprachrefferenz nicht gefunden.
Ich habe aber gerade festgestellt, das ich da wohl noch mehr Fehler drinne habe.
Gehe jetzt aber auch erst mal ins Bett.

Gruß
Christoph