2014-11-27 2 views
0

В основном через каждые 2 секунды я получаю значения в 2 десятичной цифре с помощью устройства с использованием последовательного соединения, поэтому я преобразовал каждый байт в символ, а затем конкатенирован со вторым символом (байтом), который был получен через последовательный порт, а затем назначен к одному текстовому блоку 4 последовательно (MB, GC, INS, OU), так что происходит, когда каждый раз значения обновляются в текстовом поле MB и OU, но не в другом текстовом поле. Поэтому, если кто-то может помочь мне в этой логике. (Я новичок в vb, поэтому старайтесь как можно более изобретательно).Помощь многопоточности в VB.NET

Код:

Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 
    cc = Chr(SerialPort1.ReadByte()) 
    dd = Chr(SerialPort1.ReadByte()) 
    ee = cc + dd 
    ReceivedText(ee) 

End Sub 

Private Sub ReceivedText(ByVal [text] As String) 'input from ReadExisting 
     If c = 0 Then 
     If Me.MB.InvokeRequired Then 
      Dim x As New SetTextCallback(AddressOf ReceivedText) 
      Me.Invoke(x, New Object() {(text)}) 
     Else 
      Me.MB.Text = [text] 'append text 
     End If 
      c = 1 
     ElseIf c = 1 Then 
     If Me.GC.InvokeRequired Then 
      Dim x As New SetTextCallback(AddressOf ReceivedText) 
      Me.Invoke(x, New Object() {(text)}) 
     Else 
      Me.GC.Text = [text] 'append text 
     End If 
      c = 2 
     ElseIf c = 2 Then 
     If Me.OU.InvokeRequired Then 
      Dim x As New SetTextCallback(AddressOf ReceivedText) 
      Me.Invoke(x, New Object() {(text)}) 
     Else 
      Me.OU.Text = [text] 'append text 
     End If 
      c = 3 
     ElseIf c = 3 Then 
     If Me.INS.InvokeRequired Then 
      Dim x As New SetTextCallback(AddressOf ReceivedText) 
      Me.Invoke(x, New Object() {(text)}) 
     Else 
      Me.INS.Text = [text] 'append text 
      c = 0 
     End If 
    End If 
End Sub 

ответ

1

Если бы поставить точку останова, то можно заметить, что C модифицируется дважды за один звонок. Один для «обычного» вызова и другое время для Invoke. Я предлагаю вам переместить логику для настройки «c». Поместите его сразу после изменения значения текстового поля.

Private Sub ReceivedText(ByVal [text] As String) 'input from ReadExisting 
    If c = 0 Then 
     If Me.MB.InvokeRequired Then 
      Dim x As New SetTextCallback(AddressOf ReceivedText) 
      Me.Invoke(x, New Object() {(text)}) 
     Else 
      Me.MB.Text = [text] 'append text 
      c = 1 
     End If 

    ElseIf c = 1 Then 
     If Me.GC.InvokeRequired Then 
      Dim x As New SetTextCallback(AddressOf ReceivedText) 
      Me.Invoke(x, New Object() {(text)}) 
     Else 
      Me.GC.Text = [text] 'append text 
      c = 2 
     End If 

    ElseIf c = 2 Then 
     If Me.OU.InvokeRequired Then 
      Dim x As New SetTextCallback(AddressOf ReceivedText) 
      Me.Invoke(x, New Object() {(text)}) 
     Else 
      Me.OU.Text = [text] 'append text 
      c = 3 
     End If 

    ElseIf c = 3 Then 
     If Me.INS.InvokeRequired Then 
      Dim x As New SetTextCallback(AddressOf ReceivedText) 
      Me.Invoke(x, New Object() {(text)}) 
     Else 
      Me.INS.Text = [text] 'append text 
      c = 0 
     End If 
    End If 
End Sub 

Я также предлагаю вам добавить более значимое имя переменной. Использование таких вещей, как c, cc, ee, мало значит.

Вы также можете немного уменьшить свой код. Не пытайтесь повториться. (примечание: я не собирался, чтобы посмотреть, работает ли он).

Private Sub ReceivedText(ByVal [text] As String) 'input from ReadExisting 
    Dim tbToUpdate As TextBox 

    ' This could even be in an array 
    Select Case c 
     Case 0 
      tbToUpdate = Me.MB 
     Case 1 
      tbToUpdate = Me.GC 
     Case 2 
      tbToUpdate = Me.OU 
     Case 3 
      tbToUpdate = Me.INS 
    End Case 

    If tbToUpdate.InvokeRequired Then 
     Dim x As New SetTextCallback(AddressOf ReceivedText) 
     Me.Invoke(x, New Object() {(text)}) 
    Else 
     tbToUpdate.Text = [text] 'append text 
     c += 1 

     If c == 4 Then 
      c = 0 
     End If 
    End If 

End Sub 
+0

с (целым числом = 0 (по умолчанию)) используются в качестве счетчика поэтому каждый раз, увеличивает его я могу записать новые данные в новое текстовое поле, CC дд и Й объявлены в виде строки. –

+0

@MihirGurjar, то я бы предложил вам переименовать «c» в textboxCounter –

Смежные вопросы