2012-05-17 3 views
0

Я читаю значение температуры из трансивера в последовательный порт, и я хочу, чтобы это значение изменило значение метки в моей форме Visual Basic. Это значение меняется каждые несколько секунд. Я использую ниже код:Текст ярлыка Overwrite Visual Basic

Me.dataReceived.Text &= [text] 

где DataReceived это метка, я использую и [текст] это данные Читаю из последовательного порта. Это приводит к отображению данных, но вместо того, чтобы перезаписывать метку, она записывает значение после друг друга. (Данные прилагаются). Я попытался удалить & перед =, но это не сработало, поскольку ничего не появилось. Любые идеи о том, что я могу сделать?

код я использую следующее:

'To receive data into the text field 
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived 

    While (SerialPort1.IsOpen) 
     ReceivedText(SerialPort1.ReadExisting()) 'This is called automatically every time data is received at the Serial Port 
    End While 

End Sub 

Private Sub ReceivedText(ByVal [text] As String) 

    Dim temperature As String 

    'This function compares the creating Thread's ID with the calling Thread's ID 
    If Me.dataReceived.InvokeRequired Then 
     Dim x As New SetTextCallback(AddressOf ReceivedText) 
     Me.Invoke(x, New Object() {(text)}) 
    Else 
     'To output to the text box: 
     Me.dataReceived.Text = text 

     'To output to the label 
     temperature = text 
     Me.temp.Text = text 
     hmd.Text = temperature 

    End If 
    End Sub 
+0

Символ & = означает добавить, = должен работать –

+0

Попробуйте удалить квадратные скобки вокруг текста в ваших параметрах. У вас есть опция Strict on? – APrough

+0

Что такое Strict? –

ответ

1

Попробуйте это:

If (text IsNot Nothing) AndAlso (text.Trim().Length <> 0) Then 
    Me.dataReceived.Text = text 
End If 

Я не знаком с классом SerialPort, но я сделаю все возможное, чтобы объяснить, что происходит. Последовательный порт вызывает событие, полученное данными, когда новые данные поступают через последовательный порт. Затем ваш код считывает все существующие данные, которые были получены. Когда вы вызываете метод ReadExisting, он возвращает только то, что было получено до этой точки. Он не дожидается появления всех данных до их возврата. Затем он вызывает метод ReceivedText, который устанавливает значение некоторых элементов управления в текст, который был получен. Вызовы InvokeRequired и Invoke предназначены только для возврата к потоку пользовательского интерфейса. По-видимому, событие SerialPort DataReceived может быть поднято в отдельном потоке, поэтому вам нужно вернуться к потоку пользовательского интерфейса, прежде чем вы сможете что-либо сделать с любым элементом управления формы. Изменение, которое я предложил просто проверить, чтобы убедиться, что полученный текст не был пустым или пустым, прежде чем вы изменили значение текстового поля. Странная вещь о коде состоит в том, что он продолжает читать из последовательного порта, пока он больше не будет открыт. Я бы не подумал, что ты хочешь это сделать. Скорее, я бы подумал, что в каждом событии DataReceived вы просто вызываете ReadExisting один раз, а затем просто ожидаете, что он будет снова поднят в следующий раз, когда будет получено больше данных. Постоянно вызывая ReadExisting в цикле, он должен либо возвращать пустую строку, либо пустую строку, если больше нет данных для чтения, поэтому текстовое поле было закрыто.

+0

Это сработало! Спасибо! : D –

+0

Не могли бы вы объяснить, что именно делает функция, хотя, пожалуйста, как я не знаю, что она делает. Благодаря :) –

5

Если вы хотите переписать старое значение, вы не должны использовать &= но только = присвоить новое значение:

Me.dataReceived.Text = newText 

&= - это то же самое, что и у Me.dataReceived.Text = Me.dataReceived.Text & newText

От MSDN:

&= оператор присоединяет строковое выражение на своем праве переменную типа String или свойство на его слева, и присваивает результат переменную или свойство на его левой.

+0

Я попытался удалить &, но ничего :/ –

+0

@TamaraCaligari: Можете ли вы изменить свой вопрос и показать больше, что вы пробовали? 'Me.dataReceived.Text = newText' - единственный рабочий способ, который перезаписывает старый текст. Следовательно, проблема должна быть где-то в другом месте. –

+0

Я вставил код в вопрос –

0

&= - это ваш текст. используйте =, чтобы написать надпись.

Me.dataReceived.Text = text 
0

Я не уверен, что происходит, но его вероятность того, что text не имеет значения при установке dataReceived.Text.Попробуйте это,

Private Sub ReceivedText(ByVal datatext As String) 
    Me.Invoke(Sub() 
        'To output to the text box: 
        Me.dataReceived.Text = datatext 

        Me.temp.Text = datatext 
        hmd.Text = datatext 
       End Sub) 
    End If 
End Sub 

text Я изменил к datatext поскольку text можно спутать с формами местного text собственности. Я также перенес настройку текстовых свойств меток/текстовых полей на вызов с помощью лямбда (обратите внимание, что этот синтаксис является новым и будет работать только в VB 2010). Я чувствую, что как-то ваш оператор invoke мог бы не передавать строковое значение должным образом. Кроме того, я удалил чек на InvokeRequired, так как выполнение вызова будет работать в обеих ситуациях, и похоже, что вы можете просто делать поточные вызовы каждый раз в любом случае.

Если это скомпилировано для вас, оно должно работать. Если нет, то вероятность того, что RecievedText никогда не будет вызвана. Установите некоторые точки останова и выполните код, чтобы увидеть, что значение datatext имеет значение, и на самом деле вызывается ReceivedText.