Types Arduino串行对象数据类型,用于创建包含端口引用的变量

Types Arduino串行对象数据类型,用于创建包含端口引用的变量,types,embedded,serial-port,arduino,Types,Embedded,Serial Port,Arduino,我正在和ArduinoMega2560合作一个项目。有多个串行端口可用,我希望有一个变量来保存对其中一个的引用,如下所示: SerialPort port; if (something == somethingElse) port = Serial; else port = Serial1; byte b = 5; port.write(b); // serial port 1 0x1234 SERIAL_CONTROL_REG 0x1235 SERIAL_DATA_REG

我正在和ArduinoMega2560合作一个项目。有多个串行端口可用,我希望有一个变量来保存对其中一个的引用,如下所示:

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

byte b = 5;
port.write(b);
// 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;
HardwareSerial *port;
if (something == somethingElse)
    port = &Serial;
else
    port = &Serial1;

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

然而,Arduino文档要么有限,要么我还没有找到我要找的信息。我想我需要的是“串行、串行1等的类型是什么?”

我对Arduino一无所知,但在大多数微控制器上通常这样做的方式是直接指向外围设备的寄存器区域,在本例中是串行端口。假设您的MCU映射这些寄存器,如下所示:

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

byte b = 5;
port.write(b);
// 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;
HardwareSerial *port;
if (something == somethingElse)
    port = &Serial;
else
    port = &Serial1;

byte b = 5;
port->write(b);
然后,您可以使用指针跟踪端口的状态,如下所示:

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

byte b = 5;
port.write(b);
// 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;
HardwareSerial *port;
if (something == somethingElse)
    port = &Serial;
else
    port = &Serial1;

byte b = 5;
port->write(b);
然后可以进一步扩展,以便您可以将寄存器用作变量,例如宏:

#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外设编写通用硬件驱动程序的方法,它具有多个相同的端口。

< P>串行对象的基础C++类型是“代码>硬件/软件<代码>。您可以在
\hardware\arduino\cores\arduino
中的文件中找到。然后,您可以使用如下代码使用指针:

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

byte b = 5;
port.write(b);
// 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;
HardwareSerial *port;
if (something == somethingElse)
    port = &Serial;
else
    port = &Serial1;

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

在“Arduino语言”中,我认为它在交给g++之前只是一个预处理器,Serial是指向对象的指针,而不是寄存器。他们的语言使快速原型制作变得非常简单,但正如我上面所说的,文档还有点不尽如人意。@Steve Oh?然后我强烈建议人们学习嵌入式编程而不是Arduino编程。在很多情况下都是这样,但当时间不是问题,开发时间需要保持在最低限度时,请执行
Serial.begin(9600);串行打印(“简单文本命令”)比必须设置寄存器和中断更简单、更快。这基本上是一个预先制作好的,随时可以使用的图书馆,是别人写的。这就是我需要的。非常感谢。可以用推荐信吗?因此,方法调用与。not->@Osman pasha:可能吧,但定义引用会更尴尬。大概是这样的
HardwareSerial&port=(something==somethingElse)?序列号:序列号1;字节b=5;端口写入(b)
@tinman:噢,我错过了引用的限制,谢谢。如果我们使用
流*
类型,它似乎工作得更好。但是,如果(!(*端口))
不起作用,布尔运算就会失败。