Можно ли использовать последовательный порт в качестве переменной?

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

Но менять каждую строку, где написано Serial.print или Serial.write для нового порта, довольно сложно и легко напортачить.

Можно ли создать определение в начале кода, которое позволит мне переименовать Serial в SensorSerial, чтобы, просто изменив это определение, я был уверен, что он будет использовать правильный порт?

, 👍7


2 ответа


Лучший ответ:

14

Да. Самый простой способ — с помощью макроса препроцессора. Макросы заменяются дословно до компиляции, поэтому вы можете сделать что-то вроде:

#define MY_SERIAL Serial

void setup() {
    MY_SERIAL.begin(115200);
}

void loop() {
    MY_SERIAL.println(millis());
    delay(1000);
}
,

Да, спасибо, это именно то, что я искал, @metichi


20

Ответ Маженко является правильным ответом на ваш вопрос. Но чтобы ответить на заголовок вопроса, если вам когда-либо понадобится использовать разные выходы и входы Arduino в качестве переменных, большинство из них имеют общий тип Stream или Print. Так было бы:

Stream& SensorSerial = Serial;

или

Stream* SensorSerial; 
SensorSerial = &Serial;

Иерархия классов Arduino Stream:

,

Дал ответ другому человеку, потому что он более точно соответствовал тому, что я имел в виду. Но это действительно полезно знать для другой части того же проекта., @metichi

На самом деле это то, как это делают библиотеки, и я считаю, что это лучше, чем решение с препроцессором., @AndreKR

Что еще более важно, это можно использовать во время выполнения для переключения между &Serial, &Serial2 и т. д. Макросы подходят для времени компиляции., @mckenzm

это должен быть принятый ответ., @Alnitak