Как передать последовательный объект по ссылке на мой класс в 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
}