I wish to know if there is a way to use a single property Serial0 to hold a HardwareSerial or a SoftwareSerial or other class instances supporting basic methods such as available(), read() and write(), in order to make a CustomSerial Class (polymorphism?).

class CustomSerial{
    <GenericSerial??> Serial0;
    char c;
    void read(void){

The calls should be:

CustomSerial SerialCus;
int n=SerialCus.available();
char c=SerialCus.read();

What should I use as GenericSerial class, or what should be the proper use? I tried the Stream class (as the answer pointed), but for some reason the functionality is not preserved (it writes unknown characters). Should indeed Stream be the generic class I need for this?

  • 1
    If you can not make a common class, then you can use a template. If the class (any class) has a .available() and .read() and .write(), then the compiler fills in the used class.
    – Jot
    Aug 30, 2018 at 16:40

1 Answer 1


A base type for Arduino hardware serial classes, SoftwareSerial and other software serial classes and some other Arduino classes is Stream (reference). Stream.h on GitHub

enter image description here

class CustomSerial {

  Stream &stream;

  CustomSerial(Stream &_stream) : stream(_stream) {}

  int read() {
    return stream.read();

  int available() {
    return stream.available();

  int peek() {
    return stream.peek();

  void write(byte b) {


SoftwareSerial Serial0(10, 11);
CustomSerial SerialCus(Serial0);

void setup() {

void loop(){
  if (SerialCus.available()) {
    char c = SerialCus.read();
  • I indeed used Stream for defining the property, but for some reason, this do not work the same way as using HardwareSerial, hence i have been unable to extend it for SoftwareSerial instances.
    – Brethlosze
    Aug 30, 2018 at 16:31
  • 1
    @hyprfrcb, I added code to the answer
    – Juraj
    Aug 30, 2018 at 16:51
  • This setting works perfect!... And also address how to use the Stream references... :)
    – Brethlosze
    Aug 30, 2018 at 19:22
  • 1
    The AltSoftSerial uses the Stream as well.
    – Jot
    Aug 31, 2018 at 5:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.