HardwareSerial::available()

概要

Serial.available()/HardwareSerial::available()は、シリアル通信の受信バッファ内の有効な文字数を返します。リファレンスはこちら}。

ソースコード

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

1
2
3
4
int HardwareSerial::available(void)
{
  return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail)) % SERIAL_RX_BUFFER_SIZE;
}

入力はありません。戻り値はintです。

1
2
int HardwareSerial::available(void)
{

バッファ内の有効な文字数を計算して返却します。

3
4
  return ((unsigned int)(SERIAL_RX_BUFFER_SIZE + _rx_buffer_head - _rx_buffer_tail)) % SERIAL_RX_BUFFER_SIZE;
}

rx_buffer_tail < rx_buffer_head の場合、rx_buffer_head - rx_buffer_tail がバッファ内の有効な文字数です。これにSERIAL_RX_BUFFER_SIZEを足すと、SERIAL_RX_BUFFER_SIZE分文字数が大きくなりますが、SEIRIAL_RX_BUFFER_SIZEで割った余りを求めることで、本来必要なrx_buffer_head-rx_buffer_tailに戻ります。

rx_buffer_tail > rx_buffer_head の場合、rx_buffer_head + SERIAL_BUFFER_SIZE - rx_buffer_tail がバッファ内の有効な文字数です。有効な文字数はSERIAL_RX_BUFFER_SIZEを超えることはないので、SERIAL_RX_BUFFER_SIZEで割った余りは変わりません。

わかりづらい場合は、SERIAL_BUFFER_SIZEを仮に100とかにして考えてみると比較的簡単だと思います。

バージョン

Arduino AVR Boards 1.8.6

最終更新日

March 21, 2023

inserted by FC2 system