none
Работа с данными из com порта в VB RRS feed

  • Вопрос

  • принимаю данные с com порта следующего вида (Visual stidio 2010 VB)

    $GPGGA,133523.000,4330.12611,N,04337.25592,E,1,05,04.2,480.5,M,16.2,M,,*6D
    $GPRMC,133524.000,A,4330.12612,N,04337.25595,E,00.00,308.2,140612,,,A*6A
    $PORZD,A,062.7*3F
    $GPGSA,A,3,02,28,04,80,83,,,,,,,,,,,,,,,,,,,,06.0,04.2,04.3*0A

    Вопрос:

    Как выделить три цифры (отметил жирн.) и раскидать их в нужные textboxы?

    Известно что число запятых не меняется!Помогите ПЛИЗ!

    14 июня 2012 г. 13:47

Ответы

  • Правильно ли я понял что от $GPGSA до нужных вам данных всегда одинаковое количество запятых, только с условием, что межу ними могут быть значения?

    Если так, то мой первый код будет выглядеть так:

    Dim GetReguliarReplase As New System.Text.RegularExpressions.Regex("\$GPGSA(?<match>.+)\*", System.Text.RegularExpressions.RegexOptions.IgnoreCase Or System.Text.RegularExpressions.RegexOptions.Singleline)
            Dim Tempstrmass() As String = GetReguliarReplase.Match(ComDataText).Groups("match").Value.Split(",")
            If UBound(Tempstrmass) > 0 Then
                MsgBox(Tempstrmass(UBound(Tempstrmass) - 2) & "," & Tempstrmass(UBound(Tempstrmass) - 1) & "," & Tempstrmass(UBound(Tempstrmass)))
            End If
    Плюс этого кода в том, что по сути нужные вам данные разделены по отдельности и если вам не нужна строка целиком, то вы можете взять каждый кусочек отдельно. Например предпоследний кусок данных (в примере выше 04.2) это Tempstrmass(UBound(Tempstrmass) - 1)

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа FriedrichL 15 июня 2012 г. 8:11
    15 июня 2012 г. 6:49
  • Dim GetReguliarReplase As New System.Text.RegularExpressions.Regex("\$GPGSA(?<match>.+)\*", System.Text.RegularExpressions.RegexOptions.IgnoreCase Or System.Text.RegularExpressions.RegexOptions.Singleline)
            Dim Tempstrmass() As String = GetReguliarReplase.Match(Incoming).Groups("match").Value.Split(",")
            If UBound(Tempstrmass) > 0 Then
                rezult.G = Tempstrmass(UBound(Tempstrmass) - 2) & "," & Tempstrmass(UBound(Tempstrmass) - 1) & "," & Tempstrmass(UBound(Tempstrmass))
            End If

    Кстати как сказал Дмитрий можно вообще обойтись только Split'ом. Тоесть попробуйте ще вот так:

    Dim Tempstrmass() As String = Incoming.Split(",")
            If UBound(Tempstrmass) > 0 Then
                rezult.G = Tempstrmass(UBound(Tempstrmass) - 2) & "," & Tempstrmass(UBound(Tempstrmass) - 1) & "," & Tempstrmass(UBound(Tempstrmass))
            End If

    • Изменено LXGDARK 15 июня 2012 г. 7:32
    • Помечено в качестве ответа FriedrichL 15 июня 2012 г. 8:11
    15 июня 2012 г. 7:30

Все ответы

  • Выделите их с помощью регулярных выражений:

    Dim GetReguliarReplase As New System.Text.RegularExpressions.Regex(",,,,,,,,,,,,,,,,,,,,(?<match>.+)\*", System.Text.RegularExpressions.RegexOptions.IgnoreCase Or System.Text.RegularExpressions.RegexOptions.Singleline)
            MsgBox(GetReguliarReplase.Match(ComDataText).Groups("match").Value)

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

    К слову почитайте еще этот топик, может оттуда что поможет.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    14 июня 2012 г. 14:27
  • посмотрев другой топик что то накидал:

    Public Function GetComData() As ComDataType
            Dim rezult As New ComDataType
            SerialPort2.ReadTimeout = IO.Ports.SerialPort.InfiniteTimeout
            Try
                Dim Incoming As String = SerialPort2.ReadLine
                'Здесь делаем выборку данных
                Dim GetReguliarReplase As New System.Text.RegularExpressions.Regex(",,,,,,,,,,,,,,,,,,,(?<match>.+)\*", System.Text.RegularExpressions.RegexOptions.IgnoreCase Or System.Text.RegularExpressions.RegexOptions.Singleline)
                If GetReguliarReplase.Match(Incoming).Value <> "" Then
                    rezult.G = GetReguliarReplase.Match(Incoming).Groups("match").Value
    
    
                End If
            Catch ex As TimeoutException
                Return New ComDataType
            End Try
            Return rezult
        End Function
        Public Sub SerialPort2_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort2.DataReceived
            Dim mydata As ComDataType = GetComData()
            If mydata.G <> "" Then
                TextBox1.Text = mydata.G
            End If
        End Sub

    в окошке появляются три цифры которые нужны мне, НО между этими запятыми может появиться число, тогда число запятых(пустых) уменьшается и данные пропадают...

    Может как нить сделать так типа "после этого знака $GPGSA пропускай вот столько запятых(пустых и не пустых) и считывай эти три значения"..??


    15 июня 2012 г. 6:18
  • Правильно ли я понял что от $GPGSA до нужных вам данных всегда одинаковое количество запятых, только с условием, что межу ними могут быть значения?

    Если так, то мой первый код будет выглядеть так:

    Dim GetReguliarReplase As New System.Text.RegularExpressions.Regex("\$GPGSA(?<match>.+)\*", System.Text.RegularExpressions.RegexOptions.IgnoreCase Or System.Text.RegularExpressions.RegexOptions.Singleline)
            Dim Tempstrmass() As String = GetReguliarReplase.Match(ComDataText).Groups("match").Value.Split(",")
            If UBound(Tempstrmass) > 0 Then
                MsgBox(Tempstrmass(UBound(Tempstrmass) - 2) & "," & Tempstrmass(UBound(Tempstrmass) - 1) & "," & Tempstrmass(UBound(Tempstrmass)))
            End If
    Плюс этого кода в том, что по сути нужные вам данные разделены по отдельности и если вам не нужна строка целиком, то вы можете взять каждый кусочек отдельно. Например предпоследний кусок данных (в примере выше 04.2) это Tempstrmass(UBound(Tempstrmass) - 1)

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    • Помечено в качестве ответа FriedrichL 15 июня 2012 г. 8:11
    15 июня 2012 г. 6:49
  • Проще будет считать всю строку, разбить ее Split-ом по запятым, а после считать нужные индексы из массива. При это при Split-е пустые строки должны оставаться, чтобы индекс был всегда одинаков. Если формат данных фиксирован (а он должен быть фиксирован), то это наиболее простое решение и быстрое.


    Для связи [mail]

    15 июня 2012 г. 7:11
  • почему то ComDataText подчеркивается...
    15 июня 2012 г. 7:19
  • Вы можете переписать то что Вы прислали, так чтоб выводилось

     If GetReguliarReplase.Match(Incoming).Value <> "" Then
                    rezult.G = GetReguliarReplase.Match(Incoming).Groups("match").Value

    а неMsgbox?

    15 июня 2012 г. 7:25
  • Dim GetReguliarReplase As New System.Text.RegularExpressions.Regex("\$GPGSA(?<match>.+)\*", System.Text.RegularExpressions.RegexOptions.IgnoreCase Or System.Text.RegularExpressions.RegexOptions.Singleline)
            Dim Tempstrmass() As String = GetReguliarReplase.Match(Incoming).Groups("match").Value.Split(",")
            If UBound(Tempstrmass) > 0 Then
                rezult.G = Tempstrmass(UBound(Tempstrmass) - 2) & "," & Tempstrmass(UBound(Tempstrmass) - 1) & "," & Tempstrmass(UBound(Tempstrmass))
            End If

    Кстати как сказал Дмитрий можно вообще обойтись только Split'ом. Тоесть попробуйте ще вот так:

    Dim Tempstrmass() As String = Incoming.Split(",")
            If UBound(Tempstrmass) > 0 Then
                rezult.G = Tempstrmass(UBound(Tempstrmass) - 2) & "," & Tempstrmass(UBound(Tempstrmass) - 1) & "," & Tempstrmass(UBound(Tempstrmass))
            End If

    • Изменено LXGDARK 15 июня 2012 г. 7:32
    • Помечено в качестве ответа FriedrichL 15 июня 2012 г. 8:11
    15 июня 2012 г. 7:30
  • реализовал так

                Dim GetReguliarReplase As New System.Text.RegularExpressions.Regex("\$GPGSA(?<match>.+)\*", System.Text.RegularExpressions.RegexOptions.IgnoreCase Or System.Text.RegularExpressions.RegexOptions.Singleline)
                Dim Tempstrmass() As String = GetReguliarReplase.Match(Incoming).Groups("match").Value.Split(",")
                If UBound(Tempstrmass) > 0 Then
                    TextBox1.Text = (Tempstrmass(UBound(Tempstrmass) - 2))
                    TextBox2.Text = (Tempstrmass(UBound(Tempstrmass) - 1))
                    TextBox3.Text = (Tempstrmass(UBound(Tempstrmass)))
                End If

    СПАСИБО БОЛЬШОЕ

    15 июня 2012 г. 8:11