Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
HardwareSerial()

HardwareSerial::HardwareSerial()

概要

HardwareSerial()は、シリアル通信を行うためのオブジェクト(C++の変数)を生成するコンストラクタです。Arduino Unoでは、Serialというオブジェクトが自動的に生成されます。

HardwareSerialクラスは、Streamクラスを継承しています。Streamクラスは文字列ベースのストリームを実現するためのクラスで、available()やread()、peek()、flush()という関数のひな形(これらは、Streamクラスを継承したクラスで実装する必要があります)や、find()、findUntil()、parseInt()などの関数を提供しています。

Streamクラスは、Printクラスを継承しています。Printクラスは、文字の表示に関する機能を実現しています。1文字表示のためのwrite()関数を継承したクラスで最低限実装する必要があります。print()やprintln()を利用することができます。

HarawareSerialのコンストラクタは、オブジェクト内のメンバ変数を初期化します。

Arduino Unoでは、SerialはHardwareSerialクラスです。Arduino Leonardoでは、SerialはSerial_クラスで、Serial1はHardwareSerialクラスです。

ソースコード

HardwareSerial()は、hardware/arduino/cores/arduino/HardwareSerial.cppに定義されています。以下に全ソースコードを示します。

  #define SERIAL_BUFFER_SIZE 64

struct ring_buffer
{
  unsigned char buffer[SERIAL_BUFFER_SIZE];
  volatile unsigned int head;
  volatile unsigned int tail;
};

  ring_buffer rx_buffer = { { 0 }, 0, 0};
  ring_buffer tx_buffer = { { 0 }, 0, 0};

  HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UDR0, RXEN0, TXEN0, RXCIE0, UDRIE0, U2X0);

HardwareSerial::HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer,
  volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
  volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
  volatile uint8_t *ucsrc, volatile uint8_t *udr,
  uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x)
{
  _rx_buffer = rx_buffer;
  _tx_buffer = tx_buffer;
  _ubrrh = ubrrh;
  _ubrrl = ubrrl;
  _ucsra = ucsra;
  _ucsrb = ucsrb;
  _ucsrc = ucsrc;
  _udr = udr;
  _rxen = rxen;
  _txen = txen;
  _rxcie = rxcie;
  _udrie = udrie;
  _u2x = u2x;
}


  HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR, RXEN, TXEN, RXCIE, UDRIE, U2X);

HardwareSerialクラスは、hardware/arduino/cores/arduino/HardwareSerial.hに定義されています。

Arduino Unoでは、Serialというオブジェクトが事前に定義されています。

}


  HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR, RXEN, TXEN, RXCIE, UDRIE, U2X);

rx_bufferとtx_bufferは、それぞれ、受信用のバッファと送信用のバッファで、以下のように定義されています。

  #define SERIAL_BUFFER_SIZE 64

struct ring_buffer
{
  unsigned char buffer[SERIAL_BUFFER_SIZE];
  volatile int head;
  volatile int tail;
};

  ring_buffer rx_buffer = { { 0 }, 0, 0};
  ring_buffer tx_buffer = { { 0 }, 0, 0};

送受信用にそれぞれ64バイトの大きさを持っバッファを持っています。

UBRR0H、UBRR0L、UCSR0A、UCSR0B、UCSR0C、UDR0、RXEN0、TXEN0、RXCIE0、UDRIE0、U2X0は、シリアル通信に利用するレジスタおよびレジスタ内のビットを意味します。

引数で与えられた変数を、メンバ変数に代入します。

HardwareSerial::HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer,
  volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
  volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
  volatile uint8_t *ucsrc, volatile uint8_t *udr,
  uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x)
{
  _rx_buffer = rx_buffer;
  _tx_buffer = tx_buffer;
  _ubrrh = ubrrh;
  _ubrrl = ubrrl;
  _ucsra = ucsra;
  _ucsrb = ucsrb;
  _ucsrc = ucsrc;
  _udr = udr;
  _rxen = rxen;
  _txen = txen;
  _rxcie = rxcie;
  _udrie = udrie;
  _u2x = u2x;
}

バージョン

Arduino 1.0.5



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2012 garretlab all rights reserved.
inserted by FC2 system