Di seguito il codice funzionante:

codice:
Imports System.IO.Ports
Imports System.Windows.Forms.Application

Public Class Main

    Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e _
    As System.EventArgs) Handles ExitToolStripMenuItem.Click
        SerialPort1.Close()
        End
    End Sub

    Private Sub Main_Load(ByVal sender As System.Object, ByVal e As _
    System.EventArgs) Handles MyBase.Load
        Dim data(0 to 1) as byte

        With SerialPort1
            .BaudRate = 9600
            .DataBits = 8
            .Parity = Parity.None
            .StopBits = StopBits.One
            .ReceivedBytesThreshold = 1
            .Handshake = Handshake.None
            .Encoding = System.Text.Encoding.Default
        End With

        SerialPort1.Open()
        
        ' Ciclo infinito
        Do
            SerialPort1.Write(Chr(&H55) & Chr(&H80) & Chr(&H80) & Chr(&H3))
        
            Do
                DoEvents()
            Loop Until SerialPort1.BytesToRead = 1

            SerialPort1.Read(data, 0, 1)
            TextBox1.Text = data(0)
        Loop
    End Sub

End Class
La comunicazione non da alcun problema: quando il byte viene ricevuto nel buffer di ricezione la proprietà SerialPort1.ByteToRead assume un valore pari a 1 terminando così l'iterazione del costrutto DO-LOOP annidato; il byte viene successivamente prelevato dal buffer di ricezione e presentato nella TextBox1; l'iterazione del costrutto DO-LOOP più esterno riprende da capo dando vita così ad un ciclo infinito.

PERFEZIONAMENTI:
1 - Il costrutto DO-LOOP annidato può essere visto come una procedura di POLLING continuo del buffer di ricezione e consuma risorse nell'attendere che il byte venga ricevuto nel buffer e che quindi la proprietà SerialPort1.ByteToRead assuma un valore pari a 1.
Ho letto che in alternativa è possibile utilizzare l'EVENTO DataReceived che viene generato nel momento in cui il numero di byte ricevuti all'interno del buffer di ricezione sia maggiore o uguale a quello impostato nella proprietà SerialPort1.ReceivedBytesThreshold (nel nostro caso di valore pari a 1). Questo metodo alternativo comporta un reale risparmio di risorse? Può comportare una diminuzione della velocità della comunicazione, degradando così la frequenza di aggiornamento della TextBox1? Sapreste suggerirmi da dove iniziare?

2 - Ho notato che, ridimensionando (RESIZE) o spostando (MOVE) la finestra principale, l'aggiornamento della TextBox1 si blocca a causa del blocco dell'esecuzione del codice (ho notato infatti che l'attività sulla porta seriale si interrompe del tutto); tutto riprende normalmante nel momento in cui rilascio il tasto del mouse.
So che Visual Basic .NET consente l'esecuzione di più THREAD contemporaneamente (Multi-Threading) e vorrei sfruttare questa potenzialità per eliminare questo problema. Sapreste dirmi se ciò è fattibile e come fare per ottenere questo risultato?

Grazie a tutti (in particolare ad Oregon)!!