HardwareSerial::flush()

概要

Serial.flush()/HardwareSerial::flush()は、シリアル通信の送信バッファにあるデータをすべて送信します。リファレンスはこちら}。

ソースコード

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
void HardwareSerial::flush()
{
  // If we have never written a byte, no need to flush. This special
  // case is needed since there is no way to force the TXC (transmit
  // complete) bit to 1 during initialization
  if (!_written)
    return;
 
  while (bit_is_set(*_ucsrb, UDRIE0) || bit_is_clear(*_ucsra, TXC0)) {
    if (bit_is_clear(SREG, SREG_I) && bit_is_set(*_ucsrb, UDRIE0))
    // Interrupts are globally disabled, but the DR empty
    // interrupt should be enabled, so poll the DR empty flag to
    // prevent deadlock
    if (bit_is_set(*_ucsra, UDRE0))
      _tx_udr_empty_irq();
  }
  // If we get here, nothing is queued anymore (DRIE is disabled) and
  // the hardware finished transmission (TXC is set).
}

入力はありません。戻り値もありません。

1
2
void HardwareSerial::flush()
{

_writtenが0の場合、今までシリアル通信を使って送信をしたことがない(HardwareSerial::write()を呼び出したことがない)ので、何もせずにreturnします。

3
4
5
6
7
// If we have never written a byte, no need to flush. This special
// case is needed since there is no way to force the TXC (transmit
// complete) bit to 1 during initialization
if (!_written)
  return;

_ucsrb(UCSR0B)のUDRIE0ビットが1か、_ucsra(UCSR0A)のTXC0ビットが0の場合、送信バッファが空になっていないので、空になるまでループします。

bit_is_set()は、第1引数の第2引数ビット目が1かどうかを、bit_is_clear()は、第1引数の第2引数ビット目が0かどうかを調べるマクロです。

 9
10
11
12
13
14
15
16
17
18
19
  while (bit_is_set(*_ucsrb, UDRIE0) || bit_is_clear(*_ucsra, TXC0)) {
    if (bit_is_clear(SREG, SREG_I) && bit_is_set(*_ucsrb, UDRIE0))
    // Interrupts are globally disabled, but the DR empty
    // interrupt should be enabled, so poll the DR empty flag to
    // prevent deadlock
    if (bit_is_set(*_ucsra, UDRE0))
      _tx_udr_empty_irq();
  }
  // If we get here, nothing is queued anymore (DRIE is disabled) and
  // the hardware finished transmission (TXC is set).
}

SREGのSREG_Iビットが0、かつ、_ucsrb(UCSR0B)のUDRIE0ビットが1の場合は、グローバル割り込み禁止状態でデータレジスタ空き割り込み許可状態を示します。このときは、_ucsra(UCSR0A)のUDRE0ビットが1であれば、送信バッファが空いているのでHardwareSerial::_tx_udr_empty_irq()を呼び出し、データを送信します。

whileループを抜けると、すべてのデータが送信済みになります。

バージョン

Arduino AVR Boards 1.8.6

最終更新日

August 25, 2019

inserted by FC2 system