概要
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
最終更新日
March 21, 2023