Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
Serial.flush()/HardwareSerial::flush()

Serial.flush()/HardwareSerial::flush()

概要

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

ソースコード

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

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 tranmission (TXC is set).
}

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

void HardwareSerial::flush()
{

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

  // 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かどうかを調べるマクロです。

  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 tranmission (TXC is set).
}

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

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

バージョン

Arduino 1.8.5



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

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