Подтвердить что ты не робот

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

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

У меня есть sketch, у которого есть настройка

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

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

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

В настоящий момент у моего класса есть статический Serial1, но если кто-то захочет использовать мой класс, им придется переименовать все в Serial, если они будут использовать Arduino Uno.

В myclass.h У меня есть что-то вроде

myClass(HardwareSerial *serial);

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

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

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

Я пробовал разные способы и всегда получаю ту же ошибку - кроме случаев, когда я ссылаюсь на свой класс на объект Serial, но он говорит, что 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 из .h(это продолжается: я не знаю, что использовать, Serial.write?/Serial?):

private:
HardwareSerial& _HardSerial;

EDIT 2

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

Мне нравится, что я прошу сделать это:

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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