Тип данных последовательного объекта 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 с более чем одним идентичным портом на борту.