Arduino のUART送信バッファのサイズ
Arduino UNOの送信バッファのサイズはいくつでしょうか。
検索するとほとんどのサイトで64バイトと書いてあります。これは正しいのでしょうか。
送信バッファの数を確かめるために、プログラムを書いて調べてみました。
void setup() {
Serial.begin(9600);
int count = 0;
count = Serial.availableForWrite();
Serial.print(count);
}
void loop(){
}
Serial.availableForWrite() は送信バッファに書き込めるバイト数を返す関数です。
実行結果は 63 でした。残りの1バイトはどこに行ったのでしょうか。

HardwareSerial.cpp の中にある availableForWrite 関数の中身を読むと、最後の行で -1 されて戻り値を返しています。
なぜなのでしょうか。
int HardwareSerial::availableForWrite(void)
{
tx_buffer_index_t head;
tx_buffer_index_t tail;
TX_BUFFER_ATOMIC {
head = _tx_buffer_head;
tail = _tx_buffer_tail;
}
if (head >= tail) return SERIAL_TX_BUFFER_SIZE - 1 - head + tail;
return tail - head - 1;
}
「Serial.availableForWrite() 64 」でGoogle検索すると、Arduinoのフォーラムに該当するポストがありました。
それによると、送信バッファにはリングバッファ(別名「循環バッファ」)というアルゴリズムが使われており、
その仕組み上、1バイトは空けておかなければならず、利用できるのはその1バイトを差し引いた63バイトだ、ということでした。