Arduinoで遊ぶページ

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

Serial.available()/HardwareSerial::available()

概要

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

ソースコード

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

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

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

int HardwareSerial::available(void)
{

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

  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 1.8.2



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

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