Arduino, enum + switch + seriell hjälp!

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Arduino, enum + switch + seriell hjälp!

Inlägg av ludde_018 »

Hej!

Jag håller på och gör om en befintlig kod så jag kan styra den via seriell monitor.

Jag har ett par olika driftlägen under enum som jag försöker skifta mellan med hjälp av seriell monitor. Får till det när jag bara använder en bokstav/siffra men jag behöver ord för att styra.

Jag hittade det här exemplet på nätet, men kan inte få den att fungera ihop med enum switch. Hur gör jag kopplingen?

Kod: Markera allt

// Example 3 - Receive with start- and end-markers

const byte numChars = 32;
char receivedChars[numChars];

boolean newData = false;

void setup() {
    Serial.begin(9600);
    Serial.println("<Arduino is ready>");
}

void loop() {
    recvWithStartEndMarkers();
    showNewData();
}

void recvWithStartEndMarkers() {
    static boolean recvInProgress = false;
    static byte ndx = 0;
    char startMarker = '<';
    char endMarker = '>';
    char rc;
 
    while (Serial.available() > 0 && newData == false) {
        rc = Serial.read();

        if (recvInProgress == true) {
            if (rc != endMarker) {
                receivedChars[ndx] = rc;
                ndx++;
                if (ndx >= numChars) {
                    ndx = numChars - 1;
                }
            }
            else {
                receivedChars[ndx] = '\0'; // terminate the string
                recvInProgress = false;
                ndx = 0;
                newData = true;
            }
        }

        else if (rc == startMarker) {
            recvInProgress = true;
        }
    }
}

void showNewData() {
    if (newData == true) {
        Serial.print("This just in ... ");
        Serial.println(receivedChars);
        newData = false;
    }
}



Här är enum driftlägen satta:

Kod: Markera allt

 enum operatingState { OFF = 0, SETP, RUN, TUNE_P, TUNE_I, TUNE_D, AUTO};
operatingState opState = OFF; 
Här är swtichen:

Kod: Markera allt

 recvWithStartEndMarkers();
    showNewData();
   
   opState = receivedChars;
    Serial.println(opState);
    delay(1000);

   switch (opState)
   {
   case OFF:
      Off();
      break;
   case SETP:
      Tune_Sp();
      break;
    case RUN:
      Run();
      break;
   case TUNE_P:
      TuneP();
      break;
   case TUNE_I:
      TuneI();
      break;
   case TUNE_D:
      TuneD();
      break; 
Stort tack för den som kan hjälpa mig att förstå! Trevlig kväll!
Senast redigerad av ludde_018 1 januari 2019, 23:23:25, redigerad totalt 1 gång.
Användarvisningsbild
Klas-Kenny
Inlägg: 11325
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino, enum + switch + seriell hjälp!

Inlägg av Klas-Kenny »

Har du råkat komma åt att markera "Inaktivera BBCode" när du skrev inlägget? :)

Då dina code-taggar inte tycks fungera trots att de ser korrekt skrivna ut.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Arduino, enum + switch + seriell hjälp!

Inlägg av sodjan »

> case OFF:

Symbolen (en enum) "OFF" är ju definierad till 0 (0x00, eller "null" i C-språk).
Inte helt praktiskt av många orsaker.

Det betyder att variabeln "opState" måste ha värdena 0, 1, 2, 3, 4, 5, 6 eller 7 (numeriskt)
för att casen ska fungera som du vill.

Men jag tror att du tror att du kan matcha med strängen "OFF" o.s.v. Njae...
Jag vet inte om en C switch kan matcha mer en enstaka värden (inkl enskilda char)....
Användarvisningsbild
Klas-Kenny
Inlägg: 11325
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Arduino, enum + switch + seriell hjälp!

Inlägg av Klas-Kenny »

Som Sodjan säger.

Och helt rätt har han i att C inte kan hantera switch för annat än enskilda värden (tal), det går inte med en sträng (som man ska komma ihåg, inte är annat än en char-array i C).
Värt att komma ihåg är också att enum i princip inte är någon större skillnad emot DEFINE. Du kunde alltså i princip lika väl ha skrivit #DEFINE OFF 0 osv, och få samma sak som enum.
Med enum kan man dock göra koden lite mer läsbar, och få mer hjälp av IDE'n när man skriver kod.

För att få ihop det får du göra någon översättning mellan strängarna och enum-värdena "manuellt", tex.

Kod: Markera allt

if(strcmp("OFF", opState) == 0) {
   opStateEnum = OFF;
} else if(strcmp("SETP", opState) == 0) {
   opStateEnum = SETP;
} else if....
Eller någonting åt det hållet.
ludde_018
Inlägg: 50
Blev medlem: 27 juni 2011, 20:41:09

Re: Arduino, enum + switch + seriell hjälp!

Inlägg av ludde_018 »

Strålande!

Då har jag missuppfattat funktionen och då är det ju inte så konstigt att det inte funkar. Blev nyss strömavbrott i stormen, så får testa när strömmen är tillbaka.

Stort tack!

.
Skriv svar