Playing with Arduino
A page to record my playing with Arduino
HardwareSerial::available()

Abstract

The Serial.available()/HardwareSerial::available() returns how many bytes can be written to receive buffer of serial communication.

Source Code

The HardwareSerial::available is defined in hardware/arduino/avr/cores/arduino/HardwareSerial.cpp as below.

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;
}

No input, returns int.

1
2
int HardwareSerial::available(void)
{

Calculate the number of available bytes in the buffer.

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

In case of rx_buffer_tail < rx_buffer_head, rx_buffer_head - rx_buffer_tail is the available bytes in the buffer. Adding SERIAL_RX_BUFFER_SIZE to the result, it will SERIAL_RX_BUFFER_SIZE more than the result. To get the answer, calculate the division reminder by SERIAL_RX_BUFFER_SIZE, then get rx_buffer_head-rx_buffer_tail.

In case of rx_buffer_tail > rx_buffer_head, rx_buffer_head + SERIAL_BUFFER_SIZE - rx_buffer_tail is the available bytes in the buffer. As the valid available bytes dose not exceed SERIAL_RX_BUFFER_SIZE, the result of reminder is not changed.

If it is difficult to understand, assuming SERIAL_BUFFER_SIZE something like 100, may ease the problem.

Version

Arduino 1.8.13

Last Update

June 19, 2020

inserted by FC2 system