Di seguito il codice funzionante:
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.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
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)!!

Rispondi quotando