Как передать последовательный объект по ссылке на мой класс в Arduino?

Я уже пару дней читаю о указателях, ссылках и разыменованиях в C/C++, предназначенных для Arduino, и не могу полностью понять, чего мне не хватает.

у меня эскиз, который имеет настройку

Serial.begin(9600);   //Just for logging.
Serial1.begin(9600);  //Arduino Mega-> Other Device

я использую класс-оболочку для отправки байтов через Serial1, вызывая простую функцию, такую как getStatus().

проблема в том, что я хотел бы сделать свой класс более динамичным, поэтому я хотел бы, чтобы мой класс используйте Serial1, Serial2, Serial3 или даже базовый сериал - но я не знаю, как построить мой .h и .cpp-файлы, чтобы использовать их в качестве ссылки.

на данный момент мой класс имеет статический Сериал1, но если кто-то хочет использовать мой класс, им придется переименовать все в Serial, если они используют Arduino Uno.

в myclass.ч у меня есть что-то вроде

myClass(HardwareSerial *serial);

и в myClass.СРР (конструктор):

myClass::myClass(HardwareSerial &serial) {
     _HardSerial = serial;
 ..
}

но компилятор продолжает стонать о ) expected before & or *.

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

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

объявление и создание

#include "Print.h"
//datatype* variablename = ⌖
Print* printer = &Serial; Usage

использование

//this is the equivalent of Serial.print
printer->print("print using the Serial object"); //notice the -> as opposed to .
//change target address (or which address to point to)
printer = &Serial2;
//this is the equivalent of Serial2.print
printer->print("print using the Serial2 object");

что именно то, что я хочу - но это кажется, я не понимаю. Я сделал то, что они там делали, и это не работает для меня.

правка 1

Спасибо, я сделал это так, потому что это еще лучше. Я все еще получаю эти ошибки, хотя:

:88: error: 'HardwareSerial' has not been declared

строка 88 из .h:

uint8_t Init(long BaudRate, HardwareSerial& serial);

.h:136: error: ISO C++ forbids declaration of 'HardwareSerial' with no type
.h:136: error: expected ';' before '&' token

строка 136 от .ч (это продолжает происходить - я не знаю, что использовать, серийный.писать? - Серийный?):

private:
HardwareSerial& _HardSerial;

Изменить 2

Итак, в основном потому, что я импортирую HardWareserial.h файл в файле myClass.h который импортируется в мой эскиз для использования всех материалов myClasses - он убивает ссылки в эскизе и хочет, чтобы я переопределил последовательные экземпляры. Кажется, что наследство-это неправильный путь ... раздражает. Какой конструктор по умолчанию используется в эскизе?

как будто он просит меня сделать это:

HardwareSerial Serial1(&rx_buffer1, &UBRR1H, &UBRR1L, &UCSR1A, &UCSR1B, &UDR1, RXEN1, TXEN1, RXCIE1, UDRE1, U2X1);

в самом деле? Опять я не понимаю...

3 ответов


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

ваш код должен выглядеть примерно так:

и MyClass.h

myClass(HardwareSerial *serial); // ctor
HardwareSerial * _HardSerial; // member within class

и MyClass.cpp

// Constructor takes address of serial port
myClass::myClass(HardwareSerial *serial) {
 _HardSerial = serial;
...
}

телефонный код:

// Gets the address of "Serial1" and passes that to the constructor
myClass(&Serial1); 

если вы хотите сделать это в качестве ссылок, это будет выглядеть примерно так это:

и MyClass.h

myClass(HardwareSerial& serial); // ctor taking reference
HardwareSerial& _HardSerial; // reference member within class

и MyClass.cpp

// Constructor takes reference to a serial port object
myClass::myClass(HardwareSerial& serial) :
    _HardSerial(serial) // Need to initialise references before body
{
    ...
}

телефонный код:

myClass(Serial1); // Compiler automatically uses reference

на Arduino Леонардо, я считаю Serial на самом деле не экземпляр HardwareSerial, а Serial_, из-за того, что это виртуальная USB-Ссылка, а не обычный USART.

однако оба этих класса являются подклассами Stream.

так, может быть, вы можете объявить Stream* вместо HardwareSerial*.


у меня есть одно улучшение кода г-на Мердока (большое спасибо, кстати, следуя вашему примеру о том, как инициализировать последовательный объект, сделал меня более счастливым, менее разочарованным компилятором).

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

почти то же самое, что и его код, за исключением того, что я заменяю его экземпляр объекта HardwareSerial в его классе объектом Stream.

и MyClass.h

myClass(HardwareSerial& serial, int baud, int config); // Constructor taking reference
Stream& _s; // reference member within class

и MyClass.cpp

// Constructor takes reference to a serial port object
myClass::myClass(HardwareSerial& serial = Serial, int baud = 9600, int config = SERIAL_8N1) :
_s(serial) // Need to initialise references before body
{
    serial.begin(baud, config);  //We guarantee a hardware interface at first
    this->_s = serial;           //The constructor uses the hardware serial class
                             //but we can replace it with a virtual hardware
                             //class if we have to thanks to stream
}