Vikas Banthia Ответов: 2

Чтение или получение данных с последовательного порта RS232 в visual basic 2013 (visual studio .NET)


Мы пытаемся получить вес от весовой машины.

При чтении в Гипертерминале в windows XP с помощью COM1 мы получаем правильные значения. Но читая данные в Visual Basic 2013 (в Windows 10 Pro) на моем ноутбуке с помощью кабеля USB to COM port convertor, мы получаем разные значения, такие как x,?, 3, & и т. д. Пожалуйста, предложите решение, чтобы мы могли получить правильные данные через код.

Наш код:

With Me.mvSerialPort
    .PortName = "COM11"          ' as shown in device manager
    .BaudRate = 2400
    .Parity = Parity.None
    .StopBits = StopBits.One
    .DataBits = 8
    .Handshake = Handshake.None
    .DtrEnable = True
    .RtsEnable = True
    .NewLine = vbCrLf
    .ReadTimeout = 1000
    .WriteTimeout = 1000
End With

'Function Code
    Private Function ReadCOM() As String
        Do
            If Me.mvThread_Stop = True Then Exit Do
            Try
                Try
                    If Me.mvSerialPort.IsOpen Then
                        Me.mvSerialPort.Close()
                    End If
                Catch ex As Exception
                    '
                End Try

                Try
                    Me.mvSerialPort.Open()
                    If Me.mvSerialPort.IsOpen Then
                        'Thread.Sleep(200)
                        Thread.Sleep(Val(Me.TextBox4.Text))
                        Dim svMessage As String = ""
                        Try
                            'svMessage = Me.mvSerialPort.ReadLine()
                            svMessage = Me.mvSerialPort.ReadExisting
                            updateStatus(svMessage)
                        Catch ex As Exception
                            'Me.mvThread_Stop = True
                        End Try
                    End If
                    Me.mvSerialPort.Close()
                Catch ex As Exception
                    Me.mvSerialPort.Close()
                    '
                End Try
            Catch ex As TimeoutException
                'updateStatus(ex.ToString)
            End Try
        Loop
        Return ""
    End Function

    Public Delegate Sub updateStatusDelegate(ByVal newStatus As String)
    Public Sub updateStatus(ByVal newStatus As String)
        Try
            If Me.InvokeRequired Then
                Dim upbd As New updateStatusDelegate(AddressOf updateStatus)
                Me.Invoke(upbd, New Object() {newStatus})
            Else
                Dim svSplit() As String = Split(newStatus, " ")
                Me.TextBox4.Text = svSplit(svSplit.Count - 1)
                RichTextBox1.Text = newStatus & vbCrLf & RichTextBox1.Text
            End If
        Catch ex As Exception
            '
        End Try
    End Sub


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

Код, упомянутый в моем вопросе

2 Ответов

Рейтинг:
0

CPallini

Убедитесь, что настройки последовательного порта в вашем коде совпадают с настройками, используемыми при общении с Hyperteminal. Кроме того, я бы сначала попробовал использовать Hyperterminal на ноутбуке тоже (чтобы быть уверенным, что последовательная связь обрабатывается правильно).
Как только все вышеперечисленные пункты будут в порядке, используйте отладчик для просмотра входящих данных на последовательном порту.


Рейтинг:
0

Hank Williams

Производители весов часто включают нерелевантные данные либо в начале, либо в конце, либо в обоих выводимых весовых строках. То, что я обычно делаю, - это вывод данных шкалы, которые я получаю, в несколько форматов, чтобы я мог визуализировать последовательность символов, как только я визуализирую символы, я могу быстро определить, что мне нужно сделать, чтобы извлечь только вес.

Ниже приведен один пример из одного контроллера масштаба.

Десятичные Результаты = 2-32-32-32-32-32-32-48-48-76-71-32-13-10-2-32-32-32-32-32-32-48-48-76-71-32-13-10-2-32-32-32-32-32-32-48-48-76-71-32-13-10-2-32-32-32-32-32-32-48

Десятичные текстовые результаты = STX-SPACE-SPACE-SPACE-SPACE-SPACE-SPACE-0-0-L-G-SPACE-CR-LF-STX-SPACE-SPACE-SPACE-SPACE-SPACE-SPACE-0-0-L-G-SPACE-CR-LF-STX-SPACE-SPACE-SPACE-SPACE-SPACE-SPACE-0-0-L-G-SPACE-CR-LF-STX-SPACE-SPACE-SPACE-SPACE-SPACE-SPACE-0

Необработанные результаты = 0LG
00LG
00LG
00LG
00LG

Как только у меня есть выведенная строка, я определяю одну отдельную последовательность, в этом случае это будет (используя десятичные текстовые результаты из приведенного выше текста)
КОМПАНИЯ STX-КОСМОС-КОСМОС-КОСМОС-КОСМОС-КОСМОС-КОСМОС-0-0-Л-Г-КОСМОС-СГ-ЛФ

Теперь, поскольку у меня есть точная последовательность, я могу просто извлечь одну последовательность из данных, как только у меня будет только одна последовательность, чем я просто извлеку строку веса
из одной последовательности, которая в данном случае была бы символами от 1 до 8, которые были бы ниже

КОСМОС-КОСМОС-КОСМОС-КОСМОС-КОСМОС-КОСМОС-0-0

В этом случае шкала показывала 00, но если бы она показывала 300, то выход веса выглядел бы так, как показано ниже.

КОСМОС-КОСМОС-КОСМОС-КОСМОС-КОСМОС-3-0-0

Надеюсь, это поможет...