Der Aufbau ist z.B. wie folgt:
SerialPort.ReadChar() -> Eingabe-Puffer (inBuffer) -> SerialStream ->
Treiber
.ReadChar() versucht Byte(s) im inBuffer in ein Char umzuwandeln. Sind
im inBuffer nicht genügend Daten holt er sich weitere Bytes aus dem
Stream in den inBuffer.
Der inBuffer ist nur ein internes Hilfs-Array der SerialPort-Klasse, die
für die Konvertierung passend zum eingestellten Zeichensatz
(SerialPort.Encoding) benötigt wird. Auf den inBuffer hat man keinen
direkten Zugriff.
Arbeitet man nicht mit Zeichen(-ketten) - nur mit Bytes - könnte man
auch via SerialPort.BaseStream direkt den Stream holen und die ganzen
.ReadXXX und .WriteXXX Funktionen der SerialPort-Klasse ignorieren.
.ReadBufferSize hat mit dem inBuffer übrigens nichts zu tun, das ist
eine Empfehlung für die Größe eines Puffers von Treiber/Hardware - die
der Treiber aber ignorieren darf.
(diese Schlüssen hab ich einfach mal durch grobes anschauen der
SerialPort-Klasse via ILSpy gezogen - alle Angaben ohne Gewähr ;D)