2016-06-29 5 views
0

Я делаю проект последовательной связи и хотел бы, чтобы полученная строка попала в текстовое поле, на основе которого была нажата кнопка, чтобы отправить начальную строку и вызвать ответ.Как поместить полученный серийный текст в несколько текстовых полей?

Код для ReceivedText является:

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 

Это только приводит к полученной строки вдаваясь в как коробки вместо одного или другого.

Есть ли способ получить текст в соответствующем поле?

+0

Каким должен быть ваш метод Clear? Это не является стандартным типом кнопки. Тем не менее, если вы не можете отличить текст ответа от нажатия кнопки, я вижу, по крайней мере, пару вариантов. Simplest - это общедоступная переменная, в которой нажата кнопка. – topshot

+0

Однако это не сработает, если вы можете нажать обе кнопки одновременно или до того, как ответ будет прочитан из предыдущей команды. Если это требование, вы должны начать поток для каждой кнопки, нажав и передать класс, содержащий имя кнопки и команду, как принятый ответ по адресу http://stackoverflow.com/questions/30162382/how-can-i- create-a-new-thread-addressf-a-function-with-parameters-in-vb, чтобы вы могли прочитать имя, когда оно закончилось. – topshot

+0

@topshot Я исправил метод Clear и поместил его в соответствующую строку. Я очень новичок в этом и не знаком с потоками, есть ли пример, который вы можете предоставить? Я бы предположил, что довольно просто получить полученную строку в определенном месте, на основе которой была нажата кнопка ... –

ответ

0

Ключом, который следует помнить, является то, что .Net обрабатывает все последовательные сообщения как потоки. Позвольте мне дать вам простой пример обновления текстовых полей из одной из моих программ, которая считывает данные из шкалы.

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 

Вы заметите, рутина DoScaleUpdate вызывается, который делает GUI материал:

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 

Вы можете сделать это гораздо сложнее, если вы выбираете (см пост # 15 из this thread для примера) но этого должно быть достаточно, чтобы делать то, что вам нужно.