Questão:
não é possível converter 'bool' em 'PinStatus' para o argumento '2' em 'void digitalWrite (pin_size_t, PinStatus) no Arduino Uno Rev 2 Wifi não funcionando
Braley
2019-04-19 08:14:11 UTC
view on stackexchange narkive permalink

Sou um novato em microcontroladores e estou lutando para descobrir como resolver esse problema. Ao usar um micro controlador Arduino mais antigo, ele funciona bem, mas quando eu uso uma nova placa (Arduino Uno Rev 2 Wifi), ocorre este erro:

  não é possível converter 'bool' em 'PinStatus' para o argumento '2' to 'void digitalWrite (pin_size_t, PinStatus)'  

Nesta linha:

  digitalWrite (pin_enable_line,! digitalRead (pin_enable_line)) ;  

A biblioteca que estou usando é: ReceiveOnlySoftwareSerial .

Você pode nos mostrar o esboço que está usando?
bom. o núcleo do MegaAVR usa a nova API comum do Arduino e tem enum para o status do pino. use HIGH e LOW, não bool. então `digitalWrite (pin_enable_line, (digitalRead (pin_enable_line) == HIGH)? LOW: HIGH);` (o valor ainda é LOW 0 e HIGH 1)
Um responda:
Filip Franik
2019-04-19 12:50:11 UTC
view on stackexchange narkive permalink

O método digitalRead não retorna um valor booleano. Ele retorna um inteiro.

Pelo que me lembro dentro do Arduino.h, os valores de LOW e HIGH são definidos como sendo simplesmente inteiros 0 e 1.

  #define HIGH 0x1 # define LOW 0x0  

Acho que foi alterado para um Enum chamado PinStatus , mas Enum pode ser tratado como um inteiro.

Isso significa que você deve armazenar os resultados de digitalRead dentro da variável Integer.

  int value = digitalRead (8);  

Foi projetado dessa forma para converter facilmente valores entre Inteiro e Booleano. Por (muito inteligente) escolha de design Valor inteiro de 0 ( LOW ) será convertido em false e todos os outros valores (por exemplo 1 ou HIGH ) será lançado em true.

O operador ! (Boolean NOT) pode ser usado apenas com variáveis ​​booleanas, portanto, o compilador precisa realizar vários "casts implícitos". Quando for inteligente o suficiente, ele assumirá que você sabe o que está fazendo e adicionará o elenco sozinho.

Ao ler o erro, vejo que o problema está acontecendo quando o compilador tenta converter o valor booleano em inteiro. Portanto, isso é implicitamente avaliado corretamente como um valor booleano

 ! DigitalRead (pin_enable_line)  

Mas quando você tenta colocá-lo dentro de um lugar para PinStatus, você obtém a exceção

  não pode converter 'bool' em 'PinStatus'  

Tente adicionar um "elenco explícito" a PinStatus:

  digitalWrite (pin_enable_line, (PinStatus)! digitalRead (pin_enable_line));  

Isso deve corrigir o problema. Mas sugiro dividir o código em várias linhas e adicionar uma variável temporária. Isso torna a depuração muito mais fácil. Confie no otimizador de código que está embutido no compilador. Ele entenderá o que você deseja fazer e o código de máquina real será o mesmo.

se você escreve uma resposta, por que não tenta? o elenco para o int não compila
@Juraj Strange. A linha `digitalWrite (9, (int)! DigitalRead (8));` funciona perfeitamente no Tinkercad.
para megaAVR core (Uno WiFi 2) com PinStatus enum?
@Juraj Você me pegou. Eu estava lendo o código-fonte errado e testei no simulador errado. Poste a resposta sobre o uso do operador ternário e irei deletar a minha.
cast para PinStatus pode funcionar. ele compila, mas gostaria de saber se funciona. mas não tenho uma placa que usaria a API do Arduino atualizada. mas o enum pode ser testado sozinho.
Fiz uma pequena simulação e `Serial.println ((TestEnum) false);` imprime `0` e` Serial.println ((TestEnum) true); `imprime` 1` então o elenco parece bom. Vou ajustar minha resposta. Se falhar na placa de OPs, irei excluí-lo.


Estas perguntas e respostas foram traduzidas automaticamente do idioma inglês.O conteúdo original está disponível em stackexchange, que agradecemos pela licença cc by-sa 4.0 sob a qual é distribuído.
Loading...