-1

I am trying to define multiple serial ports (multiple BMS management boards) and select via a global variable the port which one is active, this is the sketch I am trying to modify.

https://github.com/bres55/Smart-BMS-arduino-Reader/blob/master/smart_bms_reader_Mega_v11.ino

The function I want to write could be called "MySerialSwitch"

The smart_bms_reader_Mega_v11.ino has 19 calls to serial in a number of different functions. I want to be able to define the "active" MySerial in a variable that can be changed on the fly.

Something like this.

#include <SoftwareSerial.h>                   
SoftwareSerial MySoftSerial1(10, 11); // RX, TX
SoftwareSerial MySoftSerial2(12, 13); // RX, TX

#define MySerial1 MySoftSerial1
#define MySerial2 MySoftSerial2
#define MySerial3 Serial3

char MySerialPort[] = "MySerial1";


void setup()

{
MySoftSerial1.begin(9600);
MySoftSerial2.begin(9600);
Serial3.begin(9600);
}

This function would be modified

void call_get_cells_v()
{
  flush(); // flush first
  uint8_t data[7] = {221, 165, 4, 0, 255, 252, 119};
  MySerial.write(data, 7);
}

to read.

void call_get_cells_v()
{
  flush(); // flush first
  uint8_t data[7] = {221, 165, 4, 0, 255, 252, 119};
  MySerialSwitch.write(data, 7);
}

I have been researching this post

How to define a SoftwareSerial object inside a class?

And this post

Writing First Library - Serial Stream Object

It’s my first attempt at creating a library, I think this is kind of what I am trying to achieve, I've done the reading on stream, references and pointers. I'm not quite clear yet. I would really appreciate some assistance.

class MySerialSwitch {
    private:
        Stream *_dev;

    public:
        MySerialSwitch(Stream *dev) : _dev(dev) {}
        MySerialSwitch(Stream &dev) : _dev(&dev) {}
        (char MySerialPort);
};

    (int pos) {
    _dev->write(char MySerialPort);
}
2
  • sorry, what is the question? One problem I see is that for SotwareSerial you must select which one listens with the listen() function. and that SoftwareSerial doesn't work on many pins of Mega
    – Juraj
    Commented Dec 28, 2019 at 7:48
  • I think I've worked it out, I have no idea how, this explains a little more forum.arduino.cc/index.php?topic=605453.0 Commented Dec 28, 2019 at 9:10

1 Answer 1

0

I found this post, I don't think it will switch between hardware serial and software serial but it certainly works for just software.

#include <SoftwareSerial.h>                
SoftwareSerial MySoftSerial1(10, 11); // RX, TX 
SoftwareSerial MySoftSerial2(12, 13); // RX, TX 
SoftwareSerial *MySerial;


void setup()
    {

   Serial.begin(115200);
   MySoftSerial1.begin(9600);
   MySoftSerial2.begin(9600);
    }

    void loop()
    {
      MySerial = &MySoftSerial1; //Query the 1st BMS
      //or change port
      MySerial = &MySoftSerial2; //Query the 2nd BMS

      // I had to all instances of MySerial.write to MySerial->write  
    }

I'll keep reading to figure out what I've done but if anyone would like to explain, I'd be very appreciative.

This is the post I got the method from.

https://forum.arduino.cc/index.php?topic=605453.0

Thanks

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.