переобозначить Serial в setup

gonzales
Offline
Зарегистрирован: 13.07.2015

Доброго времени суток!

Есть конструкция

HardwareSerial & RS485 = Serial1;
HardwareSerial & RS485back = Serial3;

но, она жесткая, а мне нужно в setup иметь возможно переобозначить ее примерно вот так

pinMode(RS_CHANGE_PIN, INPUT_PULLUP);
  if (byte(digitalRead(RS_CHANGE_PIN)) == 0) {
    RS485 = Serial1;
    RS485back = Serial3; 
    DIR = 2;
    DIRback = 3; 
    DebugPrintln("RS-485 forward"); 
  }
  else {
    RS485 = Serial3;
    RS485back = Serial1; 
    DIR = 3;
    DIRback = 2; 
    DebugPrintln("RS-485 backward");
  }

Программа компилируется, но сериалы не работают(((

Подскажите, как сделать правильно, и можно ли вообще так делать?

 

b707
Offline
Зарегистрирован: 26.05.2017

в глобальном пространстве

HardwareSerial* RS485;

в setup()

RS485 = &Serial1;

только после этого по всей программе придется менять вызовы с точкой RS485.read() на вызовы по стрелке RS485->read()

rkit
Offline
Зарегистрирован: 23.11.2016

Ссылку перепределять нельзя, ты копируешь объекты. Используй указатель или std::ref.

gonzales
Offline
Зарегистрирован: 13.07.2015

b707 пишет:

в глобальном пространстве

HardwareSerial* RS485;

в setup()

RS485 = &Serial1;

только после этого по всей программе придется менять вызовы с точкой RS485.read() на вызовы по стрелке RS485->read()

не компилится

E:\Temp\arduino_modified_sketch_149360\Master_v2.1.ino:739:11: error: no match for 'operator=' (operand types are 'HardwareSerial' and 'HardwareSerial*')
 
     RS485 = &Serial1;
gonzales
Offline
Зарегистрирован: 13.07.2015

А можно подробнее, я думал, что & - это и есть указатель

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Максимально подробно- в любом учебнике С++

gonzales
Offline
Зарегистрирован: 13.07.2015

Судя по всему то, что я хочу сделать не получится. Так как HardwareSerial - это класс, то указатель на его экземпляр должен выглядеть вот так

HardwareSerial *RS485 = &Serial1;

и переопределить его тоже нельзя

b707
Offline
Зарегистрирован: 26.05.2017

вот только что попробовал

HardwareSerial* RDF;
void setup() {
  // put your setup code here, to run once:
RDF = &Serial1;
}

void loop() {
  // put your main code here, to run repeatedly:

}

- компилится, ошибок нет

b707
Offline
Зарегистрирован: 26.05.2017

gonzales - что за плата у вас? - под разные линейки МК разные ядра

Код выше без проблем компилится для Меги и для СТМ32

FoxJone
Offline
Зарегистрирован: 19.04.2019

b707 пишет:

вот только что попробовал

HardwareSerial* RDF;
void setup() {
  // put your setup code here, to run once:
RDF = &Serial1;
}

void loop() {
  // put your main code here, to run repeatedly:

}

- компилиться, ошибок нет

Круто, я тоже так хочу!

А можно в моем контроллере так настраивать входной канал? У меня там 485 (serial1) и mapple USB (serial)...

Вот бы можно было на ходу менять порты входящих данных...

gonzales
Offline
Зарегистрирован: 13.07.2015

Teensy 3.5

gonzales
Offline
Зарегистрирован: 13.07.2015

b707 пишет:

gonzales - что за плата у вас? - под разные линейки МК разные ядра

Код выше без проблем компилится для Меги и для СТМ32

Teensy 3.5

b707
Offline
Зарегистрирован: 26.05.2017

FoxJone пишет:

А можно в моем контроллере так настраивать входной канал? У меня там 485 (serial1) и mapple USB (serial)...

легко :)

как видите, под СТМ это компилится. И могу уверенно сказать, что не только компилится, но и работает - у меня есть проект, где я передаю в процедуру указатель на хардовый Сериал

b707
Offline
Зарегистрирован: 26.05.2017

gonzales пишет:

Teensy 3.5

под Тенси проверить не могу, этих плат у меня в ИДЕ нет. Но вообще код выше - это абсолютно стандартный метод получения указателя на экземпляр класса, странно что он не работает. Проверьте еще раз, нет ли опечаток

gonzales
Offline
Зарегистрирован: 13.07.2015

b707 пишет:

вот только что попробовал

HardwareSerial* RDF;
void setup() {
  // put your setup code here, to run once:
RDF = &Serial1;
}

void loop() {
  // put your main code here, to run repeatedly:

}

- компилится, ошибок нет

Да, нашел ошибку, все работает!!! b707 - респект и уважуха!!!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rkit пишет:

Ссылку перепределять нельзя, ты копируешь объекты. Используй указатель или std::ref.

В Ардуино IDE?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gonzales пишет:

Да, нашел ошибку

Звёздочку пропустил? Там же прямо об этом компилятор говорил :-)

gonzales
Offline
Зарегистрирован: 13.07.2015

ЕвгенийП пишет:

gonzales пишет:

Да, нашел ошибку

Звёздочку пропустил? Там же прямо об этом компилятор говорил :-)

Нет, остались сопли выше в сетапе HardwareSerial *RS485 = &Serial1; Соответственно произошло задвоение локального и глобального указателей.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

gonzales пишет:

Нет, остались сопли выше в сетапе HardwareSerial *RS485 = &Serial1; Соответственно произошло задвоение локального и глобального указателей.

Компилятор другое говорил. Значит было и то, и другое.

AlexArGC
AlexArGC аватар
Offline
Зарегистрирован: 18.11.2016

b707 пишет:

легко :)

как видите, под СТМ это компилится. И могу уверенно сказать, что не только компилится, но и работает - у меня есть проект, где я передаю в процедуру указатель на хардовый Сериал

А можно пример как это у вас оформлено? Очень интересно научится :-)