usando enums em funções

Dados os enums a seguir

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 }; 

Onde RELAY_OFF = HIGH, HIGH é #define HIGH 0x1 que presumo que seja uma constante C ++ / Arduino? porque eu não o defini. E RELAY_ON = LOW, LOW é 0x0

na função a seguir, recebo o erro a seguir.

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; }; 

Tentei fazer com que RelayState fosse uma classe enum também, mas estava obtendo erros de tipo semelhantes. Aqui está o erro do VS2015 com o código mostrado acima.

Compilando a versão de depuração de “ModelRRXingStateMachine” para “Arduino / Genuino Uno” ModelRRXingStateMachine.ino: 11: 55: erro: “RelayState” não foi declarado: boolean throwRelayAndCheckStatus (uint8_t relayNumber, RelayStateMachine.RelayState: 1: 1 erro: “CrossingZoneState” não nomeia um tipo: CrossingZoneState CheckEntrySensor (byte esp) Erro ao compilar as fontes do projeto

Não sou um programador profissional e sou novo para C ++, geralmente escrevendo em C # ou VB.Net, então não tenho certeza do que o compilador está procurando aqui, ambos os enums são declarados e um é declarado com um tipo. Além disso, o editor de código VS está mostrando n o erros, os erros mostrados acima aparecem na janela de erro quando tento construir.

Comentários

  • tudo isso está no .ino? o pré-processador de esboço pode estar reordenando as declarações e bagunçando as coisas.
  • Estou usando o Visual Studio Professional 2015 e o suplemento Visual Micro para Arduino, não o IDE do Arduino
  • e sim , todo esse código é do arquivo .ino
  • O IDE apresenta automaticamente declarações para os métodos na parte superior do arquivo, convenientemente antes que qualquer tipo que você faça seja definido. O suplemento VS também pode fazer isso, então tudo compila da mesma forma. Mover o código para um arquivo .h separado e incluir esse arquivo impediria que ele reorganizasse as coisas se esse fosse o problema.

Resposta

A solução foi mover as declarações enum para um arquivo de cabeçalho, devido ao fato de que este era um problema de suplemento de VM que será resolvido assim que eles implementarem o arduino versão 1.6.8.

Adicionar este código a um arquivo de cabeçalho e removê-lo do arquivo principal resolveu os problemas e o código é compilado e executado.

// 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 

Resposta

Por um lado, você está usando o estado da variável sem defini-lo. Além disso, você não declarou as funções CheckEntrySensor () e throwRelayAndCheckStatus (). Quando você define um sem declarar primeiro, o pré-processador arduino cria suas próprias declarações, mas geralmente o faz de maneira defeituosa. Esta é uma das idiossincrasias do ambiente arduino em comparação com um compilador C ++ simples.

A compilação a seguir 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; } 

Ou, se quiser evitar o uso de typedef, você pode usar o seguinte:

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; } 

Comentários

  • É bom que você consiga fazer o código compilar, mas parece que é um Q & Um site e alguns meses / anos a partir de agora outros inexperientes podem ficar preguiçosos (Ctrl + c Ctrl + v) e não obter qualquer entendimento sobre a causa ou solução para seus problemas. Você poderia explicar por que ele foi compilado e também talvez mencionar o uso geral de enums desta forma.
  • O tipo def é um Estrutura C e não é padrão em C ++ 11 e posterior e não é mais recomendado para enums.
  • Muitos códigos compilam, o que não ‘ t torná-lo certo ou eficaz
  • @RSM: Você está certo.
  • a) Na função CheckEntrySensor (), o estado da variável foi usado sem ser definido.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *