To add to what Richard correctly says: the reason you get the error is because the DataReceived Event is not handled by the original UI thread - as the documentation makes clear:
The DataReceived event is raised on a secondary thread when data is received from the SerialPort object. Because this event is raised on a secondary thread, and not the main thread, attempting to modify some elements in the main thread, such as UI elements, could raise a threading exception. If it is necessary to modify elements in the main Form or Control, post change requests back using Invoke, which will do the work on the proper thread.
When you try to access any control from a thread other than the thread on which they were created (the UI thread) you will get an error.
It is possible in VB to "work round" this by adding this to your form constructor:
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
But a much, much better way to do it is to use Invoke to move the Control access back to the UI thread, as explained in Richard's link.