Tutto torna: se leggi la documentazione dell'evento SerialPort.DataReceived, troverai:
L'evento DataReceived viene generato su un thread secondario quando dall'oggetto SerialPort vengono ricevuti i dati. Poiché questo evento viene generato in un thread secondario e non in quello principale, il tentativo di modificare alcuni elementi del thread principale, come gli elementi di interfaccia, potrebbe generare un'eccezione thread. Se è necessario modificare alcuni elementi nelle classi principali Form o Control, eseguire il postback delle richieste di modifica utilizzando il metodo Invoke, che eseguirà il lavoro nel thread appropriato.
(probabilmente questo dipende dal fatto che l'oggetto SerialPort dietro le quinte crea un thread secondario, in cui fa chiamate bloccanti per leggere i dati da seriale, e ogni volta che la chiamata di lettura ritorna solleva l'evento DataReceived)