8

我正在使用 ArduinoMega2560 开展一个项目。有多个串行端口可用,我想要一个变量来保存对其中一个的引用,如下所示:

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

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

但是,Arduino 文档要么有限,要么我没有找到我正在寻找的信息。我认为我需要它“Serial、Serial1 等的类型是什么?”。

4

2 回答 2

13

Serial 对象的基础 C++ 类型是HardwareSerial. 您可以在<arduino path>\hardware\arduino\cores\arduino. 然后,您可以使用如下代码使用指针:

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

byte b = 5;
port->write(b);
于 2012-08-08T15:12:58.433 回答
0

我对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 外设编写通用硬件驱动程序的方式。

于 2012-08-08T14:24:25.230 回答