I have my library that uses Serial
, Serial1
and Serial2
to establish various logging scenarios. Library user would define the config at class constructor, using simple byte constants like 0, 1 and 2.
Problem is, Serial1
and Serial2
are not available in all board types. So when I compile my code (that compiles fine on Mega) on Uno, I get error
'Serial1' was not declared in this scope
.
So I figure I need to adjust my code with preprocessor directive like #if defined
, in order to include some code only if Serial1 is defined. But it wouldn't work, because Serial1 is defined later, at compile-time. So what is the accepted way to do this?
2 Answers 2
HardwareSerial.h in Arduino AVR boards core defines HAVE_HWSERIALX
example
#ifndef HAVE_HWSERIAL1
#include "SoftwareSerial.h"
SoftwareSerial Serial1(6, 7); // RX, TX
#endif
Consider the approach used here in the ArduinoBoardManager project at github. The file ArduinoBoardManager.h uses conditional compiling to determine the correct code to compile based on processor type. A similar approach can be used to asses if certain hardware peripherals such as serial ports were available based on processor type.
#if defined(__AVR_ATmega328P__) // uno, fi
// Code compatible with an Arduino Uno
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
// Code compatible with an Arduino Mega
#endif
-
1why do it, if HardwareSerial.h does it for you. and for example Uno Wifi has additional hw Serial1 (to connect onboard esp8266) even it is a 328p2018年06月11日 16:05:36 +00:00Commented Jun 11, 2018 at 16:05
-
Oh, I agree - I didn't know about the alternatives until posted here. I just knew how the ArduinoBoardManager project was handling it.st2000– st20002018年06月12日 00:05:21 +00:00Commented Jun 12, 2018 at 0:05
Serial
(orHardwareSerial
or evenPrint
)?