Forum: Mikrocontroller und Digitale Elektronik Arduino Uno Array auslesen


von ardui (Gast)


Lesenswert?

Hallo,

ich bin noch ganz neu hier und totaler Anfänger mit dem Arduino.
Ich habe einen Arduino Uno und ein Ethernet Shield 2, mit dem ich ein 
Projekt erstellen will. Meine Programmierkenntnisse sind auch schon ewig 
her.

Nun möchte ich über einen Client einen String an den Arduino übergeben, 
der diesen dann mit einem vordefinierten String vergleicht.
Das an sich klappt schon. Also mit einem String.
Ich möchte aber zwei Angaben übergeben und diese jeweils einzeln 
"testen".

Falls es dazu schon einen Thread gibt möchte ich euch bitten mir den 
Link zu geben. Ich habe bisher dazu noch nichts gefunden.

Also ich habe beispielsweise die Eingabe: "MONITOR=ON,RELAY=1".
mit der Funktion string.IndexOf(',') komme ich auf den Wert wo das Komma 
zwischen den beiden Informationen ist. Nun wollte ich die Eingabe in 
einem Array speichern und dann die Informationen vergleichen.

Also bspw. ist das Komma an Stelle 11. Dann hätte ich gerne die Stellen 
[0] bis [10] aus der Eingabe in einem String abgespeichert und mit einem 
vorgegebenen String verglichen.

Ich wäre euch wirklich dankbar, wenn ihr mir dazu einen Tipp oder Hilfe 
geben könntet.

Mein bisheriger Code kann nur den kompletten Eingang überprüfen und gibt 
dem client dann ein Ack oder Nak abhängig von der Eingabe zurück:


-------------------------------------------------------

#include <SPI.h>
#include <Ethernet2.h>

//see sticker at the bottom of the Ethernet Shield2
byte mac[] = {, , , , , };
IPAddress ip(, , , );
//IPAddress gateway(, , ,);
IPAddress subnet(,,,);
EthernetServer server(80);

//declaration of variables
String cmd;
String res;
String s;
boolean alreadyConnected = false;

//--------------------------------------------------------------------
void setup(){

  //set PIN4 (SD-Card) as output. Using PIN10 (W5500)
  pinMode(4, OUTPUT);  //set PIN4 as Output
  digitalWrite(4, HIGH);

  // initialize the ethernet device
  Ethernet.begin(mac, ip);
  // start listening for clients
  server.begin();
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  Serial.print("Server address: ");
  Serial.println(Ethernet.localIP());
}

//--------------------------------------------------------------------
void stringComparison(){
    cmd = s;
    Serial.println();
    if(cmd.equals("TURN_ON_RELAY"))
    {
      res = "ack";
      Serial.println("Turn relay on.");
      } else if(cmd.equals("TURN_OFF_RELAY")){
            res = "ack";
            Serial.println("Turn relay off.");
      } else {
        res = "nak";
      }
    Serial.println(res);
    Serial.println();
 }
//--------------------------------------------------------------------
void loop(){
  EthernetClient client = server.available();  // wait for a new client:

  if (client) {                                // when the client sends 
the first byte
      client.flush();                          // clean out the input 
buffer:

   if (client.available() > 0) {
      int streamLength = client.available();   //streamLength: length of 
the given input
      Serial.print("Streamlength: ");
      Serial.println(streamLength);

      unsigned char* buf = new unsigned char[streamLength+1];  // read 
bytes incoming from the client:
      char thisChar = client.read(buf, streamLength);
      buf[streamLength] = '\0';
      //client.write(buf, streamLength);       //returns input to client

      Serial.print("Input from Client: ");     //Output for serial 
monitor
      Serial.write(buf, streamLength);
      Serial.println();
      s = String((const char*)buf);            //copy input in string 
's'

      stringComparison();                      //go to function
      //send 'res' to Client
      int resLength = res.length()+1;    // length of 'res' with one 
extra character for the null terminator
      char buff[resLength];              //dedicate a character array 
(buffer)
      res.toCharArray(buff, resLength);  //convert char to string
      client.write(buff, resLength);     //send string to to client

      client.stop();
      alreadyConnected = false;
      delete[] buf;
    }
  }
}

von Stefan F. (Gast)


Lesenswert?

> Ddie Eingabe: "MONITOR=ON,RELAY=1"
> string.IndexOf(',') komme ich auf den Wert wo das Komma
> Die Eingabe in einem Array speichern

Das ist auf Mikrocontrollern ein unvorteilhafter Ansatz, da Speicher 
knapp ist. Kopiere Strings nur, wenn wirklich nötig. Du hast beide 
Komanndos schon im Speicher, also liegt es nahe, Zeiger auf die 
Zeichenketten zu speichern.

Beispiel:

- char* kommandos[0] = Anfang der gesamten Zeichenkette
- Suche das Komma.
- char* kommandos[1] = Position des Kommas + 1.
- Ersetze das Komma durch 0. Dadurch wird die Zeichenkette in zwei 
Zeichenketten zerlegt.

Und schon hast du ein Array mit zwei Zeigern die auf die beiden 
Kommandos zeigen.

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.