Как передать Serial объект как число (Новая библиотека с использованием Arduino Serial) - PullRequest
0 голосов
/ 24 апреля 2020

Я хочу создать новую библиотеку, которая контролирует библиотеку Arduino Serial.

Вот что я хочу ...

main Sketch

#include <newLibrary.h>

newLibrary connection(2,9600); // 2 is Serial2, 9600 is baudRate

void main()
{
   connection.start();
}

newLibrary. cpp

newLibrary::newLibrary (uint8_t port, long baudRate)
{
   __port = port;
   __baudRate = baudRate;
}

void newLibrary::start()
{
   (Serial+port).begin(); // I need to add port to Serial to make Serial2
}

Что я хочу сделать, это:

Пользователь будет выбирать, какой последовательный порт (например, Serial / Serial1 / Serial2 et c ...) будет использоваться с;

newLibrary connection(2,9600);  // 2 is Serial2, 9600 is baudRate

и после этого функция запуска в newLibrary.h запустит этот последовательный порт с помощью алгоритма, подобного;


void newLibrary::start()
{
   (Serial+port).begin(); //  Which is equal to Serial.begin() or Serial1.begin() etc
}

Я знаю, что это можно сделать, если оператор или регистр переключения ...

Но есть ли другой способ?

Например, макросы ....

Я знаю, что макросы можно использовать как;

#define serialPort (Serial##1) // so the serialPort refers to Serial1

Но этот способ у меня не работает ....

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

C ++ не поддерживает отражение . Вы не можете создавать имена переменных во время выполнения.

Вы можете хранить указатели на объекты в контейнере.

#include <array>

class S {
public:
    void begin() {}
} Serial, Serial1, Serial2;

int main() {
    std::array serials = {&Serial, &Serial1, &Serial2};
    std::uint8_t port = 1;
    serials[port]->begin();
}
0 голосов
/ 25 апреля 2020

Вместо того, чтобы взять uint8_t, почему бы вам не взять объект Stream, а затем вы можете напрямую передать Serial2, например: соединение newLibrary (Serial2,9600);

newLibrary::newLibrary (Stream port, long baudRate)
{
   __port = port;
   __baudRate = baudRate;
}


newLibrary connection(Serial2,9600);



void newLibrary::start()
{
   _port.begin(_baudRate); //  Which is equal to Serial.begin() or Serial1.begin() etc
}

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

Мораль истории в том, что эти последовательные порты являются объектами типа Stream, поэтому вы можете передавать их как переменные, если вы используете тип Stream вместо int, byte или char.

...