JeezyWonder Ответов: 1

Vb.net проблема с последовательным портом


Я пытаюсь получить "ОК" через последовательный порт, чтобы vb.net, и VB.net проверьте это "ОК" и назначьте это значение строковой переменной с именем-check_OK, а затем я проверю это значение с помощью цикла do.

Что я уже пробовал:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub
Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    ReceivedText(SerialPort1.ReadExisting())
End Sub
Private Sub ReceivedText(ByVal text As String)
    If Me.RichTextBox1.InvokeRequired Then
        Dim x As New SetTextCallback(AddressOf ReceivedText)
        Me.Invoke(x, New Object() {(text)})
    Else
        Me.RichTextBox1.Text &= text
        Me.Label1.Text &= text
        If RichTextBox1.Text = "OK" Then
            OK_rs = 1
            RichTextBox1.Text = ""
        End If
    End If

End Sub
Delegate Sub SetTextCallback(ByVal text As String)


и вот я проверяю, что мы назначаем check_OK
Do
              If OK_rs = 1 Then Exit Do
          Loop
          OK_rs = 0

1 Ответов

Рейтинг:
8

OriginalGriff

Проблема, вероятно, именно в том, где вы делаете этот цикл Do: если он находится в потоке пользовательского интерфейса, то вызов из события DataReceived никогда не произойдет, потому что поток полностью занят проверкой состояния вашей переменной флага.
Хотя вы, вероятно, можете обойти это с помощью DoEvents, это плохая идея и не гарантирует успеха - я никогда не пробовал ее, потому что если ваш код нуждается в DoEvents, то он плохо разработан!
Вместо цикла используйте таймер: установите его на 1/10 секунды, а в обработчике тиков проверьте свой флаг.
Непрерывные Упы в приложениях Windows всегда плохая идея, если только вы не закрутили нить специально для обработки цикла (и даже тогда вам нужно подходить к ним с осторожностью).
Когда вы добавите, что версия выпуска, скорее всего, тоже не будет работать, потому что повышенная оптимизация в сборках выпуска вполне может полностью удалить цикл, и это действительно не очень хорошая идея!