2016-06-29 3 views
0

Je suis en train de faire un projet de communication série et j'aimerais que la chaîne reçue entre dans une zone de texte en fonction du bouton sur lequel on a cliqué pour envoyer la chaîne initiale et invoquer une réponse.Comment mettre du texte en série reçu dans plusieurs zones de texte?

Le code pour le ReceivedText est:

PrivateSub ReceivedText(ByVal [text] As String) 

    Button1.Clear() 
    Button2.Clear() 

    If Button1.InvokeRequired Then 
     RichTextBox1.text = [text].Trim("!") 
    End If 

    If Button2.InvokeRequired Then 
     RichTextBox2.Text = [text].Trim("!") 
    End If 

EndSub 

Il en résulte que dans la chaîne reçue d'entrer dans les deux des cases au lieu de l'un ou l'autre.

Y a-t-il un moyen de faire aller le texte dans la case appropriée?

+0

Que doit faire votre méthode Clear? Ce n'est pas un membre d'un type de bouton standard. Néanmoins, si vous ne pouvez pas distinguer du texte de réponse quel bouton a été poussé, alors je vois au moins quelques options. Le plus simple est la variable publique qui contient le bouton sur lequel on a cliqué. – topshot

+0

Cependant, cela ne fonctionnera pas si vous pouvez appuyer sur les deux boutons en même temps ou avant qu'une réponse soit lue à partir d'une commande précédente. Si c'est une exigence, alors vous commencerez un thread pour chaque appui sur un bouton et passerez dans une classe qui contient le nom du bouton et la commande comme la réponse acceptée sur http://stackoverflow.com/questions/30162382/how-can-i- create-a-new-thread-addressof-a-function-with-parameters-in-vb afin que vous puissiez relire le nom quand il a fini. – topshot

+0

@topshot J'ai corrigé la méthode Clear et l'ai placée dans la ligne appropriée. Je suis très nouveau à ce sujet et je ne suis pas familier avec le filetage, y at-il un exemple que vous pouvez fournir? J'imagine que c'est assez simple d'avoir une chaîne reçue à un certain endroit en fonction du bouton sur lequel on a cliqué ... –

Répondre

0

La clé à retenir est que .Net traite toutes les communications série en tant que threads. Permettez-moi de vous donner un exemple simple de mise à jour des zones de texte d'un de mes programmes qui lit les données d'une échelle.

Private Sub ComScale_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles ComScale.DataReceived 

    If ComScale.IsOpen Then 
     Try 
      ' read entire string until .Newline 
      readScaleBuffer = ComScale.ReadLine() 

      'data to UI thread because you can't update the GUI here 
      Me.BeginInvoke(New EventHandler(AddressOf DoScaleUpdate)) 

     Catch ex As Exception : err(ex.ToString) 

     End Try 
    End If 
End Sub 

Vous remarquerez une DoScaleUpdate routine est invoquée qui fait l'interface graphique:

Public Sub DoScaleUpdate(ByVal sender As Object, ByVal e As System.EventArgs) 
    Try 
     'getAveryWgt just parses what was read into something like this {"20.90", "LB", "GROSS"} 
     Dim rst() As String = getAveryWgt(readScaleBuffer) 
     txtWgt.Text = rst(0) 
     txtUom.Text = rst(1) 
     txttype.Text = rst(2) 
    Catch ex As Exception : err(ex.ToString) 

    End Try 
End Sub 

Vous pouvez faire beaucoup plus compliqué si vous choisissez (voir un exemple post # 15 de this thread) mais cela devrait suffire à faire ce dont vous avez besoin.