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 '18 at 16:40

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 '18 at 16:31
  • 1
    @hyprfrcb, I added code to the answer – Juraj Aug 30 '18 at 16:51
  • This setting works perfect!... And also address how to use the Stream references... :) – Brethlosze Aug 30 '18 at 19:22
  • 1
    The AltSoftSerial uses the Stream as well. – Jot Aug 31 '18 at 5:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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