Кажется, я нашел ответ!
Я не очень разбираюсь в последовательной связи, но сегодня я столкнулся с функцией MODE cmd:
C:\Users\Username>mode
Status for device COM5:
-----------------------
Baud: 9600
Parity: None
Data Bits: 8
Stop Bits: 1
Timeout: ON
XON/XOFF: OFF
CTS handshaking: OFF
DSR handshaking: OFF
DSR sensitivity: OFF
DTR circuit: OFF
RTS circuit: OFF
И я заметил, что он менялся всякий раз, когда я заставлял Arduino IDE сообщать мне данные - что всегда будет успешно! - и всякий раз, когда я пытался заставить WPF делать то же самое.
Выше приведен возврат MODE после того, как я попытался запустить свой собственный код, и:
Status for device COM5:
-----------------------
Baud: 9600
Parity: None
Data Bits: 8
Stop Bits: 1
Timeout: OFF
XON/XOFF: OFF
CTS handshaking: OFF
DSR handshaking: OFF
DSR sensitivity: OFF
DTR circuit: ON
RTS circuit: ON
это то, что было показано после открытия Tools> Serial monitor в Arduino IDE и немедленного его закрытия.
Я изменил свой код WPF с:
sp = new SerialPort("COM5", 9600);
sp.Open();
до:
sp = new SerialPort("COM5", 9600);
//sp.ReadTimeout = 200;
sp.DtrEnable = true;
sp.RtsEnable = true;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Open();
И теперь и пример потока, и событие SerialDataReceived работают без сбоев (хорошо, за исключением того, что я не могу обновить поток пользовательского интерфейса в потоке SerialDataReceived).
Я надеюсь, что кто-то найдет это полезным.