Sida 1 av 1

Arduino, enum + switch + seriell hjälp!

Postat: 1 januari 2019, 22:45:57
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!

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

Postat: 1 januari 2019, 23:21:30
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.

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

Postat: 2 januari 2019, 00:03:39
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)....

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

Postat: 2 januari 2019, 00:11:31
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.

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

Postat: 2 januari 2019, 00:28:03
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!

.