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

ライセンス

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*
  Copyright (c) 2016 garretlab.
  Added source code explanation by garretlab.
*/

/*
  HardwareSerial.cpp - Hardware serial library for Wiring
  Copyright (c) 2006 Nicholas Zambetti.  All right reserved.

  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

  Modified 23 November 2006 by David A. Mellis
  Modified 28 September 2010 by Mark Sproul
  Modified 14 August 2012 by Alarus
  Modified 3 December 2013 by Matthijs Kooijman
*/

最終更新日

August 25, 2019

inserted by FC2 system