2016-06-29 19 views
0

Ich mache ein serielles Kommunikationsprojekt und möchte die empfangene Zeichenfolge in ein Textfeld eingeben, basierend auf welcher Schaltfläche geklickt wurde, um die anfängliche Zeichenfolge zu senden und eine Antwort aufzurufen.Wie wird empfangener serieller Text in mehrere Textfelder eingefügt?

Der Code für die ReceivedText ist:

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 

Dies führt nur in den empfangenen String in gehen beide der Boxen anstelle einer oder der anderen Seite.

Gibt es eine Möglichkeit, den Text in das entsprechende Feld zu bekommen?

+0

Was soll Ihre Clear-Methode tun? Das ist kein Mitglied eines Standardschaltflächentyps. Wenn Sie jedoch nicht vom Antworttext unterscheiden können, welcher Button gedrückt wurde, dann sehe ich zumindest ein paar Optionen. Am einfachsten ist eine öffentliche Variable, die festhält, auf welche Schaltfläche geklickt wurde. – topshot

+0

Dies funktioniert jedoch nicht, wenn Sie beide Tasten gleichzeitig drücken können oder bevor eine Antwort von einem vorherigen Befehl gelesen wird. Wenn das eine Voraussetzung ist, dann würden Sie für jeden Tastendruck einen Thread starten und eine Klasse übergeben, die den Button-Namen und den Befehl enthält, wie die akzeptierte Antwort unter http://stackoverflow.com/questions/30162382/how-cani- create-a-new-thread-adressevon-a-funktion-mit-parameter-in-vb, damit du den Namen nach dem Abschluss lesen kannst. – topshot

+0

@tophot Ich habe die Clear-Methode korrigiert und in die entsprechende Zeile eingefügt. Ich bin sehr neu und bin nicht vertraut mit Threading, gibt es ein Beispiel, das Sie zur Verfügung stellen können? Ich könnte mir vorstellen, dass es ziemlich einfach ist, eine empfangene Zeichenfolge an einer bestimmten Stelle zu platzieren, je nachdem, auf welche Schaltfläche geklickt wurde ... –

Antwort

0

Der Schlüssel zum Erinnern ist, dass .Net alle serielle Kommunikation als Threads behandelt. Lassen Sie mich Ihnen ein einfaches Beispiel für die Aktualisierung von Textfeldern aus einem meiner Programme geben, die Daten von einer Waage lesen.

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 

Sie werden eine Routine DoScaleUpdate beachten Sie wird aufgerufen, die die grafische Oberfläche macht:

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 

Sie können es mehr machen viel komplizierter, wenn Sie sich entscheiden (siehe Beitrag # 15 von this thread für ein Beispiel) aber das sollte genug sein, um zu tun, was Sie brauchen.