By default, SerialPort uses ASCIIEncoding to encode the characters
You're confusing methods, which read/write strings or chars, with methods, which read/write bytes.
E.g., when you'll call this:
port.Write("абв")
you'll get "???" (0x3F 0x3F 0x3F) in the port buffer by default. On the other hand, this call:
// this is equivalent of sending "абв" in Windows-1251 encoding
port.Write(new byte[] { 0xE0, 0xE1, 0xE2 }, 0, 3)
will write sequence 0xE0 0xE1 0xE2 directly, without replacing bytes to 0x3F value.
UPD.
Let's look into source code:
public void Write(string text)
{
// preconditions checks are omitted
byte[] bytes = this.encoding.GetBytes(text);
this.internalSerialStream.Write(bytes, 0, bytes.Length, this.writeTimeout);
}
public void Write(byte[] buffer, int offset, int count)
{
// preconditions checks are omitted
this.internalSerialStream.Write(buffer, offset, count, this.writeTimeout);
}
Do you see the difference?
Method, that accepts string, converts strings to a byte array, using current encoding for port. Method, that accepts byte array, writes it directly to a stream, which is wrapper around native API.
And yes, documentation fools you.