Коммутатор потоков с несколькими последовательными портами

Я пытаюсь определить несколько последовательных портов (несколько плат управления BMS) и выбрать через глобальную переменную активный порт, это скетч, который я пытаюсь изменить.

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

Функция, которую я хочу написать, могла бы называться "MySerialSwitch"

В smart_bms_reader_Mega_v11.ino есть 19 вызовов серийного номера в различных функциях. Я хочу иметь возможность определить «активный» MySerial в переменной, которую можно изменить на лету.

Что-то вроде этого.

#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);
}

Эта функция будет изменена

void call_get_cells_v()
{
  flush(); // сначала очистить
  uint8_t data[7] = {221, 165, 4, 0, 255, 252, 119};
  MySerial.write(data, 7);
}

читать.

void call_get_cells_v()
{
  flush(); // сначала очистить
  uint8_t data[7] = {221, 165, 4, 0, 255, 252, 119};
  MySerialSwitch.write(data, 7);
}

Я изучал этот пост

Как определить объект SoftwareSerial внутри класса?

И этот пост

Запись первой библиотеки — объект последовательного потока

Это моя первая попытка создать библиотеку, я думаю, что это то, чего я пытаюсь достичь, я читал в потоке, ссылки и указатели. Я еще не совсем ясно. Буду очень признателен за помощь.

class MySerialSwitch {
    private:
        Stream *_dev;

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

    (int pos) {
    _dev->write(char MySerialPort);
}

, 👍-1

Обсуждение

простите, в чем вопрос? Одна проблема, которую я вижу, заключается в том, что для SotwareSerial вы должны выбрать, какой из них прослушивает с помощью функции listen(). и что SoftwareSerial не работает на многих выводах Mega, @Juraj

Я думаю, что у меня это получилось, я понятия не имею, как, это объясняет немного больше https://forum.arduino.cc/index.php?topic=605453.0, @Paul Fisher


1 ответ


0

Я нашел этот пост, я не думаю, что он будет переключаться между серийным номером оборудования и серийным номером программного обеспечения, но он определенно работает только для программного обеспечения.

#include <SoftwareSerial.h>                
SoftwareSerial MySoftSerial1(10, 11); // прием, передача
SoftwareSerial MySoftSerial2(12, 13); // прием, передача
SoftwareSerial *MySerial;


void setup()
    {

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

    void loop()
    {
      MySerial = &MySoftSerial1; // Запрос 1-й BMS
      //или меняем порт
      MySerial = &MySoftSerial2; //Запросить вторую BMS

      // Я должен был все экземпляры MySerial.write записать в MySerial->write
    }

Я буду продолжать читать, чтобы понять, что я сделал, но если кто-то захочет объяснить, я был бы очень признателен.

Это сообщение, из которого я получил метод.

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

Спасибо

,