Ethernet Switch (case) Problem

Hallo,

ich verwende eine Arduino Mega mit dem Ethernet Switch V4.06 Code von http://www.instructables.com/id/Ethernet-Switching-with-Arduino/step3/Ethernet-Switching-Version-406/

 if (client.available()) {

        //if header was not set send it
        
         //read user input
        char c = client.read();
        
          if(c == '*'){

          printHtmlHeader(client); //call for html header and css
          printLoginTitle(client);
          printHtmlFooter(client);
          //sentHeader = true;
          break;
        }
        
        if(!sentHeader){
          
            printHtmlHeader(client); //call for html header and css
            printHtmlButtonTitle(client); //print the button title
            
          //This is for the arduino to construct the page on the fly. 
          sentHeader = true;
        }

        //read user input
    //    char c = client.read();

        //if there was reading but is blank there was no reading
        if(reading && c == ' '){
          reading = false;
        }

        //if there is a ? there was user input
        if(c == '?') {
          reading = true; //found the ?, begin reading the info
        }

       // if there was user input switch the relevant output
        if(reading){
          
          //if user input is H set output to 1
          if(c == 'H') {
            outp = 1;
          }
          
          //if user input is L set output to 0
          if(c == 'L') {
            outp = 0;
          }
          
          Serial.print(c);   //print the value of c to serial communication
          //Serial.print(outp);
          //Serial.print('\n');

          switch (c) {

             case '0':
               //add code here to trigger on 0
               triggerPin(outputAddress[0], client, outp);
               break;            
             case '1':
            //add code here to trigger on 1
               triggerPin(outputAddress[1], client, outp);
               break;             
             case '2':
               //add code here to trigger on 2
               triggerPin(outputAddress[2], client, outp);
               break;
             case '3':
               //add code here to trigger on 3
               triggerPin(outputAddress[3], client, outp);
               break;
             case '4':
               //add code here to trigger on 4
               triggerPin(outputAddress[4], client, outp);
               break;
             case '5':
               //add code here to trigger on 5
               triggerPin(outputAddress[5], client, outp);
               //printHtml(client);
               break;
             case '6':
               //add code here to trigger on 6
               triggerPin(outputAddress[6], client, outp);
               break;
             case '7':
               //add code here to trigger on 7
               triggerPin(outputAddress[7], client, outp);
               break;
             case '8':
               //add code here to trigger on 8
               triggerPin(outputAddress[8], client, outp);
               break;
             case '9':
               //add code here to trigger on 9
               triggerPin(outputAddress[9], client, outp);
               break;
          } //end of switch case

Ich würde gerne mehr als 10 Ausgänge festlegen, doch habe Probleme wenn ich case '10', case '11';, etc verwende.

Habe es schon mit if probiert, komme aber zu keinem guten Ergebnis.

Auch wenn ich

  case '22':
               //add code here to trigger on 7
               triggerPin(outputAddress[7], client, outp);
               break;

bis

  case '31':
               //add code here to trigger on 7
               triggerPin(outputAddress[7], client, outp);
               break;

verwende funktioniert alles, aber ab 32 kommen wieder folgende Probleme:

error: duplicate case value.

Ich bin noch Anfänger :D, kann mir jemand dabei helfen?
So schwer kann es doch eigentlich nicht sein, oder?

Danke
JulHa

Ein char ist ein Zeichen. 0-9 geht daher. Aber was soll '10' sein? Das sind zwei Zeichen. Das kompiliert zwar leider, ist aber das gleiche wie '1'.

Zahlen kannst du recht einfach einlesen, wenn du die aktuelle Ziffer mitzählst. Also 1, 10, 100 etc. Dann addierst du die gerade eingelesene Ziffer * die Wertigkeit der Stelle auf den bisherigen Wert. z.B. 2100 + 010 + 3*1 = 203.

Von einem char auf die Ziffer in Dezimal kommst du einfach mit c - '0', c - 48 oder c - 0x30. Siehe:

Dann lasse den ganzen Abfrage-Kram weg und mach einfach das:

triggerPin(outputAddress[zahl], client, outp);

Nachdem du die Zahl eingegeben und korrekt ausgelesen hast

Danke schonmal,
aber c ist in dem Falle aber nicht immer eine Zahl, sondern auch folgendes:

 char c = client.read();

        if(c == '*'){

          printHtmlHeader(client); //call for html header and css
          printLoginTitle(client);
          printHtmlFooter(client);
          //sentHeader = true;
          break;
        }

        if(!sentHeader){

          printHtmlHeader(client); //call for html header and css
          printHtmlButtonTitle(client); //print the button title

          //This is for the arduino to construct the page on the fly. 
          sentHeader = true;
        }

        //read user input
        //    char c = client.read();

        //if there was reading but is blank there was no reading
        if(reading && c == ' '){
          reading = false;
        }

        //if there is a ? there was user input
        if(c == '?') {
          reading = true; //found the ?, begin reading the info
        }

        // if there was user input switch the relevant output
        if(reading){

          //if user input is H set output to 1
          if(c == 'H') {
            outp = 1;
          }

          //if user input is L set output to 0
          if(c == 'L') {
            outp = 0;
          }

          Serial.print(c);   //print the value of c to serial communication
          //Serial.print(outp);
          //Serial.print('\n');

          switch (c) {

          case '0':
            //add code here to trigger on 0
            triggerPin(outputAddress[0], client, outp);
            break;            
          case '1':
            //add code here to trigger on 1
            triggerPin(outputAddress[1], client, outp);
            break;             
          case '2':
            //add code here to trigger on 2
            triggerPin(outputAddress[2], client, outp);
            break;
          case '3':
            //add code here to trigger on 3
            triggerPin(outputAddress[3], client, outp);
            break;
          case '4':
            //add code here to trigger on 4
            triggerPin(outputAddress[4], client, outp);
            break;
          case '5':
            //add code here to trigger on 5
            triggerPin(outputAddress[5], client, outp);
            //printHtml(client);
            break;
          case '6':
            //add code here to trigger on 6
            triggerPin(outputAddress[6], client, outp);
            break;
          case '7':
            //add code here to trigger on 7
            triggerPin(outputAddress[7], client, outp);
            break;
          case '8':
            //add code here to trigger on 8
            triggerPin(outputAddress[8], client, outp);
            break;
          case '9':
            //add code here to trigger on 9
            triggerPin(outputAddress[9], client, outp);
            break;
          } //end of switch case

        }//end of switch switch the relevant output 

        //if user input was blank
        if (c == '\n' && currentLineIsBlank){
          printLastCommandOnce = true;
          printButtonMenuOnce = true;
          triggerPin(777, client, outp); //Call to read input and print menu. 777 is used not to update any outputs
          break;
        }

Und? Eine Ziffer ist nur ein char zwischen '0' und '9'. chars sind nichts als der Wert des Zeichens in der ASCII Tabelle.

Du kannst z.B. einfach das machen um abzufragen ob du eine Ziffer hast:

if(c >= '0' && c <= '9')

Und wie geht es dann weiter, wenn es mehr als eine Ziffer ist (z.B. 11)?

int cc = c;

Habe ich in diesem Falle beide Ziffern(c) als Integer(cc) und kann dann

 switch (cc) {

             case '0':
               //add code here to trigger on 0
               triggerPin(outputAddress[0], client, outp);
               break;            
             case '1':
            //add code here to trigger on 1
               triggerPin(outputAddress[1], client, outp);
               break;  

[...]
           
             case '29':
               //add code here to trigger on 29
               triggerPin(outputAddress[29], client, outp);
               break;

ausführen?

Kam nun auf folgende Idee:

         //read user input
        char c = client.read();
        
          if(c == '*'){

          printHtmlHeader(client); //call for html header and css
          printLoginTitle(client);
          printHtmlFooter(client);
          //sentHeader = true;
          break;
        }
        
        if(!sentHeader){
          
            printHtmlHeader(client); //call for html header and css
            printHtmlButtonTitle(client); //print the button title
            
          //This is for the arduino to construct the page on the fly. 
          sentHeader = true;
        }

        //read user input
    //    char c = client.read();

        //if there was reading but is blank there was no reading
        if(reading && c == ' '){
          reading = false;
        }

        //if there is a ? there was user input
        if(c == '?') {
          reading = true; //found the ?, begin reading the info
        }

       // if there was user input switch the relevant output
        if(reading){
          
          //if user input is H set output to 1
          if(c == 'H') {
            outp = 1;
          }
          
          //if user input is L set output to 0
          if(c == 'L') {
            outp = 0;
          }
          
          Serial.print(c);   //print the value of c to serial communication
          //Serial.print(outp);
          //Serial.print('\n');

          
        char c = client.read();
        Serial.print("c ist ");
        Serial.print(c);
        
        char d = client.read();
        Serial.print("d ist ");
        Serial.print(d);
        
        int cd = c + d;
        Serial.print("cd ist ");
        Serial.print(cd);
        
        
          switch (cd) {

             case '0':
               //add code here to trigger on 0
               triggerPin(outputAddress[0], client, outp);
               break;            
             case '1':
            //add code here to trigger on 1
               triggerPin(outputAddress[1], client, outp);
               break;             
             case '2':
               //add code here to trigger on 2
               triggerPin(outputAddress[2], client, outp);
               break;
             case '3':
               //add code here to trigger on 3
               triggerPin(outputAddress[3], client, outp);
               break;
             case '4':
               //add code here to trigger on 4
               triggerPin(outputAddress[4], client, outp);
               break;
             case '5':
               //add code here to trigger on 5
               triggerPin(outputAddress[5], client, outp);
               //printHtml(client);
               break;
             case '6':
               //add code here to trigger on 6
               triggerPin(outputAddress[6], client, outp);
               break;
             case '7':
               //add code here to trigger on 7
               triggerPin(outputAddress[7], client, outp);
               break;
             case '8':
               //add code here to trigger on 8
               triggerPin(outputAddress[8], client, outp);
               break;
             case '9':
               //add code here to trigger on 9
               triggerPin(outputAddress[9], client, outp);
               break;
             case '10':
               //add code here to trigger on 10
               triggerPin(outputAddress[10], client, outp);
               break;
                 case '11':
               //add code here to trigger on 11
               triggerPin(outputAddress[11], client, outp);
               break;
                case '12':
               //add code here to trigger on 12
               triggerPin(outputAddress[12], client, outp);
               break;
          } //end of switch case

        }//end of switch switch the relevant output 

        //if user input was blank
        if (c == '\n' && currentLineIsBlank){
          printLastCommandOnce = true;
          printButtonMenuOnce = true;
          triggerPin(777, client, outp); //Call to read input and print menu. 777 is used not to update any outputs
          break;
        }

Hab nur grade keinen Arduino zum testen, nachdem ich es geschafft habe, dass meiner vom PC nichtmehr erkannt wird... Wie auch immer ich das geschafft habe...

Kann mir jemand sagen ob der Code so funktioniert, bis mein neuer Mega mit der Post da ist? :smiley:

Hat nicht funktioniert...

 int cd = c + d;

ergibt 110, 111, 112,... und Fehler ab 120

Dir wurde in beiden Threads gesagt was du falsch machst. Das ignorierst du aber. Statt dessen machst du immer noch Unsinn wie '11'. Du hast auch eine völlig falsche Vorstellung davon was ein char ist.

Wie gesagt, schau in die ASCII Tabelle:

'0' ist 48. '1' ist 49. '2' ist 50. Jedes Zeichen hat einen Wert zwischen 0 und 127. Bei den Ziffern entspricht dieser aber nicht dem Zahlenwert.
Wenn du einen char in eine Ziffer umwandeln willst musst du von dem char '0' abziehen. Da 48 - 48 = 0. 49 - 48 = 1.

Wenn du dann die Ziffern aufaddieren willst, musst du dir auch in einer extra Variable die Ziffer merken. Und dann 1. Ziffer * 1 + 2. Ziffer * 10 + 3. Ziffer * 100, etc. machen. Halt die Wertigkeiten des Dezimalsystems. Wenn du z.B. eine Variable "ziffer" für die Wertigkeit hast und bei 1 anfängst, multiplizierst du bei jedem Schritt 10 drauf. Dann hast du so 1, 10, 100, 1000, etc.

Man kann auch eine eingebene Zeile komplett einlesen und danach parsen. Das wird für dich aber auch sehr kompliziert sein und ist hier nicht unbedingt nötig.

Und die meisten deiner cases sind unnötig. Du musst die Zahl parsen, so dass du am Ende einen Integer hast. Diesen kannst du dann direkt als Index für das Array verwenden. Ohne jede Ziffer einzeln abzufragen und zu unterscheiden. Eine Gültigkeitsprüfung auf den Bereich schadet aber nichts.

client.available() gibt übrigens true zurück auch wenn nur ein Zeichen da ist. Da dann mehrmals hintereinander read() zu machen ist nicht unbedingt so eine gute Idee. Besser ist man macht nur einmal read() pro Durchlauf der Parse Funktion und lässt loop() da einfach ständig durchlaufen. So bekommt man auch alle Zeichen mit, auch wenn zwischen deren Ankunft mehr Zeit vergeht.