Newsgroup: it.comp.lang.visual-basic
Titolo: Dati da porta seriale e Textbox

Gentili Utenti,
Ho bisogno di estrapolare dei dati dalla Porta seriale.
Ho usato come guida il seguente articolo:
http://www.devx.com/dotnet/Article/31001/1954?pf=true
estrapolo:
<CODE>
Private Sub DataReceived( _
ByVal sender As Object, _
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
Handles serialPort.DataReceived
txtDataReceived.Invoke(New _
myDelegate(AddressOf updateTextBox), _
New Object() {})
End Sub
Public Delegate Sub myDelegate()
Public Sub updateTextBox()
With txtDataReceived
.Font = New Font("Garamond", 12.0!, FontStyle.Bold)
.SelectionColor = Color.Red
.AppendText(serialPort.ReadExisting)
.ScrollToCaret()
End With
End Sub
</CODE>
dove la txtDataReceived è una RichTextBox
Il problema è che a me in arrivo sulla porta seriale arrivano una
stringa del genere:
"R.D F.  1084  ok vbCrLf ER.T U. 1  ok vbCrLf"
Dovrei estrapolare la cifra 1084 e 1 della seconda parte e poi mettere
il valori in una TextBox o in una label.
Il problema è una stringa o una textbox non hanno il .AppendText e poi
non so controllare l'evento "non ci sono più dati da leggere".
Qualche suggerimento?
Grazie
Sal

C'è qualcosa che ancora non mi torna:
Ho definito un array di caratteri
Dim Ric(39) As Char
Private Sub serialPort_DataReceived(ByVal sender As Object, _
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _
Handles serialPort.DataReceived
  serialPort.Read(Ric, 0, 40)
'metto quello che mi arriva dalla porta seriale nel array partendo
' dall'offset 0 e leggo 40 caratteri (o byte?) alla volta
  Call Sto_Mat()
End Sub
Private Sub Sto_Mat()
 If Me.InvokeRequired Then
  Me.Invoke(New Sto_MatDelegate(AddressOf Sto_Mat))
  Return
 End If
 TextBox1.Text = Ric(0).ToString & Ric(1).ToString & _
 Ric(2).ToString & Ric(3).ToString 'eccetera eccetera
End Sub
Ma non mi funziona a dovere, mi perdo alcuni caratteri, in una maniera
che non riesco a capire,
se ricevo "bb" dalla porta seriale
visualizzo nella textbox: "b"
poi ricevo stringhe più complesse e i caratteri si sovrascrivono...
Dove sbaglio?
Grazie
Sal

Sembra che Sal abbia detto :

La seriale è asincrona rispetto all'evento.
Alla ricezione del primo carattere (o anche di più secondo un parametro 
impostabile), ti viene scatenato l'evento.
Tu devi accodare quanto ricevuto in una stringa, e dopo l'accodamento 
fai un parsing della stringa per vedere se è valida (quindi, o 
lunghezza fissa o carattere terminatore, ad esempio). Se è valida, 
gestisci la parte valida e lasci il resto nella stringa che sarà 
accodato con quanto ricevuto successivamente, ecc...
Periodicamente, ad esempio quando si invia, puoi pulire la stringa 
'buffer'.
Ciao
Alberto
-- 
Léo Campion: Il lavoro è l'occupazione di chi non ha nulla da fare.

poi ricevo stringhe più complesse e i caratteri si sovrascrivono...
A me la porta seriale in .Net è una delle poche cose che non ha dato grossi
problemi, probabilmente l'UCAS se ne è occupato poco.   :-) 
Io ho fatto così:
______________
Dim InputStr  As String
......
 Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As
System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    Dim s As String
            Try
               s = SerialPort1.ReadTo(vbCr)
               Dim t As Int16 = s.Length
               If t > 0 Then
                  If Convert.ToByte(s(0)) = 0 Then
                     Dim Sb As New StringBuilder
                     Sb.Append(s)
                     Sb.Remove(0, 1)
                     s = Sb.ToString()
                  End If
               End If
               InputStr = s
            Catch ex As Exception
            End Try
 
   End Sub
_____________
L'unico problema che ho avuto è  uno 0 che a volte mi compare all'inizio della
stringa, e che elimino con quelle istruzioni al centro della routine.
.ReadTo  ti permette di sciegliere fino a che carattere leggere.
In alternativa puoi usare .ReadLine 
Meglio anche usare un Try - Catch. 
Il perchè lo capirai quando vorrai fermare il programma con delle comunicazioni
in corso.
--
ciao
  Stefano

 Alberto
Ora funziona tutto, a volte qualche piccolo suggerimento può risvere
questioni bloccate da giorni
grazie  a tutti
ho fatto così:
<CODE>
Private Sub serialPort_DataReceived_
(ByVal sender As Object, ByVal e As
System.IO.Ports.SerialDataReceivedEventArgs)_
 Handles serialPort.DataReceived
stringa_da_seriale = stringa_da_seriale & serialPort.ReadExisting
If stringa_da_seriale.Length > 30 Then
  misura_estrapolata = stringa_da_seriale.Substring(8, 4)
End If
Call Sto_Mat()
End Sub
Private Sub Sto_Mat()
If Me.InvokeRequired Then
 Me.Invoke(New Sto_MatDelegate(AddressOf Sto_Mat))
 Return
End If
TextBox1.Text =   misura_estrapolata
End Sub
</CODE>
Ancora Grazie
Sal

Sembra che Sal abbia detto :

Ti consiglio comunque di aggiungere alcuni utili giocattoli:
- Dopo aver messo la parte estrapolata nella stringa 'utile', togliere 
lo stesso pezzo dal buffer complessivo, che nel frattempo potrebbe già 
contenere, alla fine, l'inizio di un messaggio successivo.
- Pulire il buffer quando si invia una richiesta
- Oltre alla lunghezza, controllare anche che ci siano i doverosi 
caratteri di inizio e fine messaggio, altrimenti se ad un certo punto 
c'è un telegramma interrotto, ti si 'sfasa' tutta la storia e non 
funziona più niente finchè non riavvii...
Ciao
Alberto
-- 
Heinrich Zille: Ognuno crede che l'altro sia come se stesso, 
dimenticando che al mondo esistono anche delle persone oneste.