Pages: [1]   Go Down
Author Topic: Newbie braucht Hilfe bei Serial Monitor  (Read 619 times)
0 Members and 1 Guest are viewing this topic.
Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo an das Forum. Ich beschäftige mich seit 2 Monaten mit dem Arduino und arbeite an meinem ersten Projekt. Der Code befindet sich in den Kinderschuhen und ich habe schon ein Problem, welches ich  nicht so richtig packen kann.

Vorab :Die Überprüfung des Gesamtcodes ergibt keine Fehler.

über den SerialMonitor(SM) wird P1, P2 oder P3 eingegeben und in der var inputString gespeichert. Abhängig von der Eingabe möchte ich bestimmte Werte der var p zuweisen. Lustigerweise wird Px nicht als true erkannt. hier der Codeschnipsel:

   
    if(inputString == "P1")   {
    p=1;
    }
    if(inputString == "P2")   {
    p=2;
    }
    if(inputString == "P3")   {
    p=3;
    }
   
  Wo habe ich hier einen Fehler gemacht? Serial.println(inputString) zeigt mir dass auch Px in der var angekommen ist. Und nu? Alle Beispiele, die ich gefunden habe passen nicht. smiley-confuse

Gruß
Eberhard
Logged

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."  

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Strings können beim Vergleichen lustige Seiteneffekte verursachen. Um der Sache auf den Grund gehen zu können, wäre es gut, wenn Du den kompletten Sketch posten könntest. Idealerweise in den "#" Tags, damit der Code auch als Code angezeigt wird.
Wichtig wäre nämlich zu wissen, von welchem Typ Deine Variable inputString ist.
Logged

Hannover, Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Du vergleichst hier keine Zeichenketten, sondern Zeiger auf die Speicherstellen, in denen die Zeichenketten gespeichert sind (ja: das ist C  smiley-twist).
strcmp ist hier Dein Freund:

Code:
if (strcmp (inputString, "P1") == 0) ...

usw.

viele Grüße
Andreas
Logged

http://danimathblog.blogspot.com

#define true '/'/'/'
#define false '-'-'-'

Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hier der Code. Aufgeräumt wird später smiley-mr-green smiley-mr-green.....


Code:
/*
  Web client to serve Logitech-squeezebox
  by Eberduino
  based on a sketch
  by David A. Mellis
 
 
 */

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

00:00:00:00:00:00

byte mac[]    = {0xDE,0xAD,0xBE,0xEF,0xFE,0xED};  //Mac-Adresse Arduino
byte ip[]     = {192,168,2,xxx};  //Arduino
byte server[] = {192,168,2,xx};   // HAL(MediaServer)
String httpHead = "Get /status?";
String httpFoot = " HTTP/1.1";
String player[6]  = {"&player=00:00:00:00:00:01",
"&player=00:00:00:00:00:02",
"&player=00:00:00:00:00:03",
"&player=00:00:00:00:00:04",
"&player=00:00:00:00:00:05",
"&player=00:00:00:00:00:06"};

String inputString ="";
boolean stringComplete = false;
boolean sendhttp = false;
boolean clientOnline = false;
int p=0;

// Initialize the Ethernet client library
// with the IP address and port of the server
EthernetClient client;

void setup() {
 
  Serial.begin(9600);  // start the serial library
  inputString.reserve(200);
 
  Ethernet.begin(mac, ip);// start the Ethernet connection
  delay(1000); // give the Ethernet shield a second to initialize
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 9002)) {
    Serial.println("connected");
    clientOnline=true;
  }
  else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()
{
  /*/ if there are incoming bytes available
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }*/

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("reconnecting.");
    client.stop();
    delay(1000);
    client.connect(server, 9002);

  }
  if (client.connected()) {
    if(clientOnline){
    Serial.println();
    Serial.println("connected.");
    clientOnline = false;
    }
  }
 
  /*
 
  switch (inputString){
  case "P0":
  p=0;
  break;
  case "P1":
  p=1;
  break;
  case "P2":
  p=2;
  break;
  case "P3":
  p=3;
  break;
  case "P4":
  p=4;
  break;
  }   
  Das funktionierte ebenfalls nicht*/
 
  //Uberprüfung, wecler Inhalt über SM ankam und setzen der p-var für den player
    if (stringComplete) {

    if(inputString == "P1")   {
    p=1;
    }
    if(inputString == "P2")   {
    p=2;
    }
    if(inputString == "P3")   {
    p=3;
    }
       
   
   
    Serial.println(inputString);
    client.println("GET /status?p0=playlist&p1=resume&p2=" + inputString + player[p] + httpFoot); //Befehl an Logitech Media Center
    Serial.println("GET /status?p0=playlist&p1=resume&p2=" + inputString + player[p] + httpFoot); //zur Überprüfung an SM
   
   //zurücksetzen der Variablen
    inputString = "";
    stringComplete = false;
  }


  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
   
  }
 
 /* Noch in Bearbeitung */
 
}

Gruß Eberhard
Logged

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."  

Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@Andreas

hier bekomme ich eine Fehlermeldung:
WebClient_Squeezebox1:106: error: cannot convert 'String' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'

Jetzt vermute ich dass mkl0815 nicht falsch liegt mit der Definition der Variablen - aber ich kann kein C  smiley-cry und weiß nicht was ich dort falsch gemacht haben soll.

Eberhard
Logged

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."  

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Soweit ich das sehe, verwendest Du die Klasse "String" für die Variable inputString. Daher ist das mit dem Vergleich erstmal nicht so falsch.
Ich würde jetzt erstmal schrittweise vorgehen und das Programm auf das wesentliche reduzieren. D.h. nur von der seriellen Schnittstelle lesen und dann die Daten ausgeben und vergleichen. Ich würde außerdem prüfen, ob evtl. neben dem "P0" oder "P3" noch ein anderes Zeichen mit an dem seriell übermittelten String dran hängt. Schickt Windows nicht immer ein "\r\n"? Nicht das Du das "\r" auch noch mit am String hängen hast, da ja nur auf "\n" für das Ende getestet wird. Am einfachsten ist es wohl, sich mal die Länge von inputString ausgeben zu lassen.
inputString.length() liefert die Länge.
Achso, ein inputString.startWith("P3") statt des inputString == "P3" könnte im Fall von zusätzlichen Zeichen auch helfen.
« Last Edit: February 14, 2012, 04:35:39 am by mkl0815 » Logged

Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@danimath:
Bei der Verwendung Deiner Zeile gibt es nur die Fehlermeldung:
cannot convert 'String' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'
Dabei habe ich extra die lib stdlib.h inzugefügt. Da soll der Befehl beheimatet sein. Sie wird aber nicht wirklich eingebunden, weil die lib im Code schwarz geschrieben wird. Sie liegt bei mir im Ordner arduino-1.0/hardware/tools/avr/avr/include

@Andreas
Die über den SM kommende Länge bei "P1" beträgt in der Tat 3, also hängt da noch was dran. Versucht habe ich folgende Möglichkeiten:
 1. if(inputString == "P2"+'\n')
 2. if(inputString == "P2"+'\r')
 3. if(inputString == "P2"+'\0') // ich hatte gelesen, dass der SM grundsätzlich eine 0 anhängt zur Ende-Erkennung.

In keinem Fall ist der Vergleich erfolgreich.
Bei inputString.startWith("P3") kommt auch eine Fehlermeldung: 'class String' has no member named 'startWith'

Dabei will ich doch "nur" zwei Strings miteinander vergleichen.... smiley-cry

Hat noch jemand nicht irgendwelche Ideen/Vorschläge?

Gruß
Eberhard


Umgebung: Arduino-1.0; Board: Arduino-Uno
Logged

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."  

Offline Offline
Edison Member
*
Karma: 21
Posts: 1397
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
ein wenig Eigeninitiative ist manchmal auch ganz nützlich.  smiley
Ein Blick in die Dokumentation ist nie verkehrt. Gerade wenn man erst anfängt sich mit einem Thema zu beschäftigen, sollte man immer schauen wo man gute Infos findet.
Schau mal unter:
http://arduino.cc/en/Reference/StringStartsWith
Die Methode heisst "startsWith()".
Ansonsten sei Dir die Refernce-Seite empfohlen: http://arduino.cc/en/Reference/HomePage
Mario.
Logged

Hannover, Germany
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

cannot convert 'String' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'

OK, OK: die Klasse String ist nicht das gleiche wie ein C-Zeichenkette (die i.W. ein Pointer auf char ist  smiley-wink) Dann bleibt nur eine Methode aus der Klasse String - und da hat Dir Mario ja schon einen Pointer gegeben.

Andreas
Logged

http://danimathblog.blogspot.com

#define true '/'/'/'
#define false '-'-'-'

Mönchengladbach, Germany
Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Mario,

Du bist ja mal heute DER King! Genau so geht es!

Tja, was nach außen wie mangelnde Eigeninitiative aussieht, war nach innen Suche in unzähligen Tutorials. leider hatte ich das Pech, diesem Befehl nie zu "begegnen". Ich Da ich auf der Eingangsseite der Referenz diesen Befehl nicht fand, dachte ich, der kommt aus 'ner anderen Lib. Dass er unter String zu finden ist, war mir (noch) nicht klar.

Ich habe wieder was gelernt und werde mich bessern. "Dieser Weg wird kein leichter sein...."

Würde ein C++ Kurs aus dem Internet mir (und dadurch auch euch) helfen?

Dank Dir nochmal.
Eberhard
Logged

Oscar Wilde: "Am Ende wird alles gut, und wenn es noch nicht gut ist - ist es nicht das Ende."  

Pages: [1]   Go Up
Jump to: