usando enumeraciones en funciones

Dadas las siguientes enumeraciones

enum RelayState { RELAY_OFF = HIGH, RELAY_ON = LOW }; enum class CrossingZoneState: uint8_t { CROSSINGZONE_CLEAR = 0, // no train in crossing area, also initialized state CROSSINGZONE_OCCUPIED = 1, // train detected by the entry sensor CROSSINGZONE_EXITING = 2 // train detected by the exit sensor, when sensor clears, state= Clear }; 

Donde RELAY_OFF = HIGH, HIGH es #define HIGH 0x1 que supongo que es una constante de C ++ / Arduino? porque no lo definí. Y RELAY_ON = LOW, LOW es 0x0

en la siguiente función obtengo el error que sigue.

CrossingZoneState CheckEntrySensor(uint8_t esp) { //esp, short for entry sensor pin if (digitalRead(esp) == HIGH) { state = CrossingZoneState::CROSSINGZONE_CLEAR; return state; } else if (digitalRead(esp) == LOW) { state = CrossingZoneState::CROSSINGZONE_OCCUPIED; return state; } // if the digital read errs, return the current state so it re-runs return state; }; boolean throwRelayAndCheckStatus(uint8_t relayNumber, RelayState relayState) { int testInt = 0; if (relayState == RelayState::RELAY_OFF) { testInt = 1; } digitalWrite(relayNumber, relayState); if (digitalRead(relayNumber) == testInt) { return true; }; return false; }; 

Intenté que RelayState también fuera una clase de enumeración, pero recibía errores de tipo similar. Aquí está el error de VS2015 con el código que se muestra arriba.

Compilando la versión de depuración de «ModelRRXingStateMachine» para «Arduino / Genuino Uno» ModelRRXingStateMachine.ino: 11: 55: error: «RelayState» no ha sido declarado: boolean throwRelayAndCheckStatus (uint8_t relayNumber, RelayState relayState: 2. error: «CrossingZoneState» no nombra un tipo: CrossingZoneState CheckEntrySensor (byte esp) Error al compilar las fuentes del proyecto

No soy un programador profesional y soy nuevo a C ++, generalmente escribiendo en C # o VB.Net, así que no estoy seguro de lo que el compilador está buscando aquí, ambas enumeraciones se declaran y una se declara con un tipo. Además, el editor de código VS muestra n o errores, los errores que se muestran arriba aparecen en la ventana de error cuando intento compilar.

Comentarios

  • ¿Está todo esto en .ino? el preprocesador de bocetos puede estar reordenando las declaraciones y estropeando las cosas.
  • Estoy usando Visual Studio Professional 2015 y el complemento Visual Micro para Arduino, no el IDE de Arduino
  • y sí , todo este código es del archivo .ino
  • El IDE automáticamente presenta declaraciones de métodos en la parte superior del archivo, convenientemente antes de que se defina cualquier tipo que usted haga. El complemento VS también podría hacerlo, por lo que todo se compila igual. Mover el código a un archivo .h separado e incluir ese archivo evitaría que se reordenan las cosas si ese fuera el problema.

Respuesta

La solución fue mover las declaraciones de enumeración a un archivo de encabezado, debido al hecho de que se trataba de un problema de complemento de VM que se resolverá una vez que se haya implementado la versión 1.6.8 de arduino.

Agregar este código a un archivo de encabezado y eliminarlo del archivo principal resolvió los problemas y el código se compila y se ejecuta.

// ModelRRCrossing.h #ifndef _MODELRRCROSSING_h #define _MODELRRCROSSING_h #if defined(ARDUINO) && ARDUINO >= 100 #include "arduino.h" #else #include "WProgram.h" #endif #pragma once // Arduino Digital I/O pin numbers for MEGA //note: digital pins 30-45 //MEGA is a MUST for this project enum { Relay1 = 30, Relay2 = 31, Relay3 = 32, Relay4 = 33, Relay5 = 34, Relay6 = 35, Relay7 = 36, Relay8 = 37, Relay9 = 38, Relay10 = 39, Relay11 = 40, Relay12 = 41, Relay13 = 42, Relay14 = 43, Relay15 = 44, Relay16 = 45 }; enum RelayState { RELAY_OFF = HIGH, RELAY_ON = LOW }; enum class CrossingZoneState : uint8_t { CROSSINGZONE_CLEAR = 0, // no train in crossing area, also initialized state CROSSINGZONE_OCCUPIED = 1, // train detected by the entry sensor CROSSINGZONE_EXITING = 2 // train detected by the exit sensor, when sensor clears, state= Clear }; #endif 

Answer

Por un lado, está utilizando el estado de la variable sin definirlo. Además, no ha declarado las funciones CheckEntrySensor () y throwRelayAndCheckStatus (). Cuando define un función sin antes declararla, el preprocesador arduino construye sus propias declaraciones, pero a menudo lo hace de forma defectuosa. Esta es una de las idiosincrasias del entorno arduino frente a un compilador C ++ simple.

La siguiente compilación s:

enum RelayState { RELAY_OFF = HIGH, RELAY_ON = LOW }; typedef enum RelayState RelayState_t ; enum CrossingZoneState { CROSSINGZONE_CLEAR = 0, // no train in crossing area, also initialized state CROSSINGZONE_OCCUPIED = 1, // train detected by the entry sensor CROSSINGZONE_EXITING = 2 // train detected by the exit sensor, when sensor clears, state= Clear }; typedef enum CrossingZoneState CrossingZoneState_t ; CrossingZoneState_t CheckEntrySensor(uint8_t esp) ; boolean throwRelayAndCheckStatus(uint8_t relayNumber, RelayState_t relayState) ; CrossingZoneState_t CheckEntrySensor(uint8_t esp) { CrossingZoneState_t state ; //esp, short for entry sensor pin if (digitalRead(esp) == HIGH) { state = /*CrossingZoneState_t::*/CROSSINGZONE_CLEAR; return state; } else if (digitalRead(esp) == LOW) { state = /*CrossingZoneState::*/CROSSINGZONE_OCCUPIED; return state; } // if the digital read errs, return the current state so it re-runs return state; } boolean throwRelayAndCheckStatus(uint8_t relayNumber, RelayState_t relayState) { int testInt = 0; if (relayState == /*RelayState::*/RELAY_OFF) { testInt = 1; } digitalWrite(relayNumber, relayState); if (digitalRead(relayNumber) == testInt) { return true; }; return false; } 

O, si desea evitar el uso de typedef, puede utilizar lo siguiente:

enum RelayState { RELAY_OFF = HIGH, RELAY_ON = LOW }; enum CrossingZoneState: uint8_t { CROSSINGZONE_CLEAR = 0, // no train in crossing area, also initialized state CROSSINGZONE_OCCUPIED = 1, // train detected by the entry sensor CROSSINGZONE_EXITING = 2 // train detected by the exit sensor, when sensor clears, state= Clear }; enum CrossingZoneState CheckEntrySensor(uint8_t esp) ; boolean throwRelayAndCheckStatus(uint8_t relayNumber, enum RelayState relayState) ; enum CrossingZoneState CheckEntrySensor(uint8_t esp) { enum CrossingZoneState state ; //esp, short for entry sensor pin if (digitalRead(esp) == HIGH) { state = CROSSINGZONE_CLEAR; return state; } else if (digitalRead(esp) == LOW) { state = CROSSINGZONE_OCCUPIED; return state; } // if the digital read errs, return the current state so it re-runs return state; } boolean throwRelayAndCheckStatus(uint8_t relayNumber, enum RelayState relayState) { int testInt = 0; if (relayState == RELAY_OFF) { testInt = 1; } digitalWrite(relayNumber, relayState); if (digitalRead(relayNumber) == testInt) { return true; }; return false; } 

Comentarios

  • Es bueno que puedas obtener el código para compilar, pero parece que es una Q & Un sitio y algunos meses / años a partir de ahora otros sin experiencia pueden volverse perezosos (Ctrl + c Ctrl + v) y no comprender la causa o solución de sus problemas. Por lo tanto, ¿podría explicarnos el por qué se compiló y también tal vez menciona el uso general de enums de esta manera?
  • El tipo def es Estructura C y no es estándar en C ++ 11 y posteriores y ya no se recomienda para enumeraciones.
  • Se compila una gran cantidad de código, que no ‘ t hazlo correcto o efectivo
  • @RSM: Tienes razón.
  • a) En la función CheckEntrySensor (), el estado de la variable se usó sin estar definido.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *