8

私はArduinoMega2560を使ったプロジェクトに取り組んでいます。利用可能な複数のシリアル ポートがあり、そのうちの 1 つへの参照を保持する変数が必要です。たとえば、次のようになります。

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

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

ただし、Arduino のドキュメントは限られているか、探している情報が見つかりません。「シリアル、シリアル1などのタイプは何ですか?」と必要なものだと思います。

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 に答える