Domanda:
Rileva se Serial1 e Serial2 sono definiti, in fase di compilazione
Passiday
2018-06-11 17:03:26 UTC
view on stackexchange narkive permalink

Ho la mia libreria che utilizza Serial , Serial1 e Serial2 per stabilire vari scenari di registrazione. L'utente della libreria definirebbe la configurazione nel costruttore della classe, utilizzando semplici costanti di byte come 0, 1 e 2.

Il problema è che Serial1 e Serial2 non lo sono disponibile in tutti i tipi di tavola. Quindi, quando compilo il mio codice (che si compila bene su Mega) su Uno, ottengo l'errore 'Serial1' non è stato dichiarato in questo ambito .

Quindi immagino di dover aggiustare il mio codice con direttiva del preprocessore come #if defined , in modo da includere del codice solo se Serial1 è definito. Ma non funzionerebbe, perché Serial1 è definito più tardi, in fase di compilazione. Allora qual è il modo accettato per farlo?

Non sono sicuro che l'SDK abbia un hardware particolare che definisce la configurazione per cose come una porta seriale. La maggior parte guarda alle definizioni del processore dell'SDK e usa direttive di compilazione condizionale come "#ifdef ARDUINO_AVR_UNO".
Inoltre, sto guardando [ArduinoBoardManager nel codice sorgente github] (https://github.com/backupbrain/ArduinoBoardManager) e non vedo dove definiscono l'hardware come la porta seriale su una base per processore. Forse potresti aggiungerlo e riutilizzare questo codice. Ma penso ancora che il modo più semplice per farlo sia scegliere quale codice della porta seriale si desidera compilare in base al tipo di processore. Guarda il codice sorgente in questo progetto GitHub per vedere come hanno fatto.
Perché non fare in modo che il costruttore prenda un riferimento a un oggetto di tipo "Serial" (o "HardwareSerial" o anche "Print")?
Due risposte:
Juraj
2018-06-11 17:27:59 UTC
view on stackexchange narkive permalink

HardwareSerial.h nel core delle schede AVR Arduino definisce HAVE_HWSERIALX

esempio

  #ifndef HAVE_HWSERIAL1 # include "SoftwareSerial.h" SoftwareSerial Serial1 (6, 7); // RX, TX # endif  
st2000
2018-06-11 17:35:15 UTC
view on stackexchange narkive permalink

Considera l'approccio utilizzato qui nel progetto ArduinoBoardManager su github. Il file ArduinoBoardManager.h utilizza la compilazione condizionale per determinare il codice corretto da compilare in base al tipo di processore. Un approccio simile può essere utilizzato per valutare se determinate periferiche hardware come le porte seriali fossero disponibili in base al tipo di processore.

  #if defined (__ AVR_ATmega328P__) // uno, fi // Codice compatibile con un Arduino Uno # elif defined (__ AVR_ATmega1280__) || defined (__ AVR_ATmega2560__) // Codice compatibile con un Arduino Mega # endif  
perché farlo, se HardwareSerial.h lo fa per te. e per esempio Uno Wifi ha Serial1 hw aggiuntivo (per connettersi a bordo esp8266) anche se è un 328p
Oh, sono d'accordo - non conoscevo le alternative fino a quando non sono stato pubblicato qui. Sapevo solo come lo stava gestendo il progetto ArduinoBoardManager.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...