Тип данных последовательного объекта Arduino, чтобы создать переменную, содержащую ссылку на порт

Я работаю над проектом с ArduinoMega2560. Есть несколько последовательных портов, и я хотел бы иметь переменную для хранения ссылки на один из них, что-то вроде этого:

SerialPort port;
if (something == somethingElse)
    port = Serial;
else
    port = Serial1;

byte b = 5;
port.write(b);

однако документация Arduino либо ограничена, либо я не нашел информацию, которую ищу. Я думаю, что мне это нужно "каков тип для Serial, Serial1 и т. д.?".

2 ответов


базовый тип C++ для последовательных объектов -HardwareSerial. Вы можете найти это в файлах в <arduino path>\hardware\arduino\cores\arduino. Затем вы можете использовать указатели, используя такой код:

HardwareSerial *port;
if (something == somethingElse)
    port = &Serial;
else
    port = &Serial1;

byte b = 5;
port->write(b);

Я ничего не знаю об Arduino, но то, как это обычно делается на большинстве микроконтроллеров, заключается в том, что вы указываете прямо на область регистра перигерального, в данном случае последовательного порта. Предположим, что ваш MCU отображает эти регистры следующим образом:

// serial port 1
0x1234 SERIAL_CONTROL_REG
0x1235 SERIAL_DATA_REG
0x1236 SERIAL_STATUS_REG

// serial port 2
0x2000 SERIAL_CONTROL_REG
0x2001 SERIAL_DATA_REG
0x2002 SERIAL_STATUS_REG

затем вы можете отслеживать порт с указателем, так:

#define SERIAL_PORT1 ((volatile uint8_t*)0x1234)
#define SERIAL_PORT2 ((volatile uint8_t*)0x2000)

typedef volatile uint8_t* serial_port_t;
...

serial_port_t port;

if (something == somethingElse)
    port = SERIAL_PORT1;
else
    port = SERIAL_PORT2;

затем это можно расширить, чтобы вы могли использовать регистры как переменные, например, с макросы:

#define SERIAL_CONTROL_REG(offset) (*(offset + 0))
#define SERIAL_DATA_REG(offset)    (*(offset + 1))
#define SERIAL_STATUS_REG(offset)  (*(offset + 2))

if(SERIAL_STATUS_REG(port) & some_mask)
{
  SERIAL_DATA_REG(port) = 0xAA;
}

Так вы обычно пишете общие драйверы оборудования для периферийных устройств MCU с более чем одним идентичным портом на борту.