Модераторы: diadiavova, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка строки, Строка в NMEA формате 
V
    Опции темы
Actionman
Дата 7.8.2011, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



Всем привет. Юзаю GPS модуль. Он рисылает данные в виде NMEA к примеру: $GPGGA,165113.000,5601.0318,N,01211.3503,E,1,07,1.2,22.4,M,41.6,M,,0000*60

здесь:
время UTC:165113.000 (16часов 51 мин 13 сек)
долгота: 5601.0318 
N(северная или S- южная)
широта: 01211.3503 
E(восточная или W-западная)
высота:41.6, М - метры


Необходимо эти данные из строки вытащить. Возможно сделать маску строки или еще какие способы есть. Прошу помочь., может кто-то уже сталкивался.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  NMEA_protocol.F4A140F269024530B614546A5527978C.pdf 266,07 Kb
PM MAIL   Вверх
iff
Дата 7.8.2011, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: нет
Всего: 16



В VB6 нет встроенной поддержки регулярных выражений.
Можно воспользоваться функцие split, она разделит строку на массив. например:
Код

datarr = split("$GPGGA,165113.000,5601.0318,N,01211.3503,E,1,07,1.2,22.4,M,41.6,M,,0000*60", ",")

Результат будет:
Код

datarr(0) = "$GPGGA"
datarr(1) = "165113.000"
datarr(2) = "5601.0318"
' и так далее

А затем уже можно обрабатывать каждый элемент массива по отдельности.
П.С. все элементы такого массива - строки. Что-бы получить число можно использовать функцию val.


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
Actionman
Дата 7.8.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



Да , попробывал тоже етим методом, вроде получилось, но есть какойто кося, ругается, что размер массива выходит за границы. 
код:

 
Код

Public Class Form1
    Private mySerialPort As New SerialPort
    Dim i As Integer
    Dim n As Integer
    Dim buffer As String()
    Dim GPS_recieve As String
    Private Delegate Sub UpdateFormDelegate()
    Private UpdateFormDelegate1 As UpdateFormDelegate
.........
 
 
Код

Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
       UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf UpdateDisplay)
       GPS_recieve = mySerialPort.ReadExisting()
        Dim SplitString As String() = GPS_recieve.Split(New [Char]() {","c})
        n = SplitString.Length
For i=0 to n
        buffer(i) = SplitString(i)  'здлесь жалуется, по разному пробывал записать все  в массив
Next
        Me.Invoke(UpdateFormDelegate1) 'call the delegate
    End Sub

    Private Sub UpdateDisplay()

        TextBox1.Text = buffer(0)
        TextBox2.Text = buffer(1)
        TextBox3.Text = buffer(2)
        TextBox4.Text = buffer(3)
        TextBox5.Text = buffer(4)
        TextBox6.Text = buffer(5)

    End Sub


Это сообщение отредактировал(а) Akina - 7.8.2011, 21:03
PM MAIL   Вверх
iff
Дата 7.8.2011, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: нет
Всего: 16



1. используйте тег "код"
2.
Цитата(Actionman @  7.8.2011,  17:39 Найти цитируемый пост)
Dim buffer As String()

buffer должен быть не string(), а variant.
Цитата(Actionman @  7.8.2011,  17:39 Найти цитируемый пост)
Dim SplitString As String() = GPS_recieve.Split(New [Char]() {","c})

 smile вы точно на VB6 пишете?
GPS_recieve.Split - может в этом модуле уже есть функция Split какая-то своя...
New [Char]() {","c}  smile

Добавлено через 2 минуты и 37 секунд
Если mySerialPort.ReadExisting возвращает строку результата, то:
Код

buffer = Split(mySerialPort.ReadExisting, ",")

А buffer можно, как сказано выше, объявит variant или вообще не объявлять (он по умолчанию будет variant)


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
Actionman
Дата 7.8.2011, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



оу извиняюсь, не VB6 , в студии пишу 2010. Попробывал еще раз, все равно то же(((
Вот весь код: 

Код

Imports System.IO.Ports

Public Class Form1
    Private mySerialPort As New SerialPort
    'Dim _command As String
    Dim i As Integer
    Dim n As Integer
    'Dim text_box(7) As String
    Dim buffer As VariantType()
    'Dim offset As Integer
    'Dim count As Integer
    Dim GPS_recieve As String
    Private Delegate Sub UpdateFormDelegate()
    Private UpdateFormDelegate1 As UpdateFormDelegate


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            mySerialPort.Open()
            RadioButton1.Checked = True
            RadioButton1.Text = "COM2 is Opened"
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        mySerialPort.DiscardInBuffer()
        mySerialPort.Write("start")

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        'mySerialPort.DiscardInBuffer()
        mySerialPort.DiscardOutBuffer()
        mySerialPort.Close()
        RadioButton1.Checked = False
        RadioButton1.Text = "COM2 is Closed"
    End Sub

    Private Sub CommPortSetup()
        With mySerialPort
            .PortName = "COM2"
            .BaudRate = 19200
            .DataBits = 8
            .Parity = Parity.None
            .StopBits = StopBits.One
            .Handshake = Handshake.None
            .DiscardNull = True
        End With
    End Sub

    Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated

    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        End
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'offset = 0
        'count = 8
        Call CommPortSetup()
        AddHandler mySerialPort.DataReceived, AddressOf mySerialPort_DataReceived
        TextBox1.TextAlign = HorizontalAlignment.Right
        TextBox2.TextAlign = HorizontalAlignment.Right
        TextBox3.TextAlign = HorizontalAlignment.Right
        TextBox4.TextAlign = HorizontalAlignment.Right
        TextBox5.TextAlign = HorizontalAlignment.Right
        TextBox6.TextAlign = HorizontalAlignment.Right
        'TextBox7.TextAlign = HorizontalAlignment.Right
        'TextBox8.TextAlign = HorizontalAlignment.Right
    End Sub

    Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
        'Handles serial port data received events
        UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf UpdateDisplay)
        'n = mySerialPort.BytesToRead  'find number of bytes in buf
        'buffer = New Byte(n - 1) {} 're dimension storage buffer
        'mySerialPort.Read(buffer, offset, count) 'read data from the buffer
        GPS_recieve = mySerialPort.ReadExisting()
        Dim SplitString As String() = GPS_recieve.Split(New [Char]() {","c})
        n = SplitString.Length
        buffer(n) = SplitString(n)

        Me.Invoke(UpdateFormDelegate1) 'call the delegate
    End Sub

    Private Sub UpdateDisplay()

        TextBox1.Text = CStr(buffer(0))
        TextBox2.Text = CStr(buffer(1))
        TextBox3.Text = CStr(buffer(2))
        TextBox4.Text = CStr(buffer(3))
        TextBox5.Text = CStr(buffer(4))
        TextBox6.Text = CStr(buffer(5))

    End Sub

    Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

    End Sub

    Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click

    End Sub

   

End Class





скрин ошибке приложен.

Это сообщение отредактировал(а) Actionman - 7.8.2011, 19:08

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  ______1.JPG 198,98 Kb
PM MAIL   Вверх
Akina
Дата 7.8.2011, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



Перемещено в VB .NET.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
diadiavova
Дата 7.8.2011, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
krewin
Дата 8.8.2011, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 27.8.2009

Репутация: 1
Всего: 1



замени строку n = SplitString.Length на строку n = SplitString.Length-1 все будет работать. SplitString.Length показывает количество строк в масиве а не последнию строку в масиве. Массив начинается с нуля
PM MAIL   Вверх
Actionman
Дата 8.8.2011, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



Впринципе так тоже делал, но все же попробывал еще раз)))
 теперь другая ошибка блин  smile 

 
Код

Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
        'Handles serial port data received events
        Dim i As Integer
        UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf UpdateDisplay)
        GPS_recieve = mySerialPort.ReadExisting()
        Dim SplitString As String() = GPS_recieve.Split(New [Char]() {","c})
        n = SplitString.Length - 1
        For i = 0 To n
            buffer(i) = SplitString(i)
        Next
        Me.Invoke(UpdateFormDelegate1) 'call the delegate
    End Sub


ниже скрин

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  ______.JPG 193,98 Kb
PM MAIL   Вверх
krewin
Дата 8.8.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 27.8.2009

Репутация: 1
Всего: 1



поменяй  Dim buffer As VariantType() на  Dim buffer() As String
PM MAIL   Вверх
Actionman
Дата 9.8.2011, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



Цитата(krewin @ 8.8.2011,  20:21)
поменяй  Dim buffer As VariantType() на  Dim buffer() As String

то же самое(
PM MAIL   Вверх
krewin
Дата 9.8.2011, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 27.8.2009

Репутация: 1
Всего: 1



добавь размер массива Dim buffer(100) As String вот так
PM MAIL   Вверх
diadiavova
Дата 9.8.2011, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 8
Всего: 142



А зачем в данном случае вообще копировать массив поэлементно, когда метод Сплит возвращает готовый строковый массив? Вместо вот этого
Код

        Dim SplitString As String() = GPS_recieve.Split(New [Char]() {","c})
        n = SplitString.Length - 1
        For i = 0 To n
            buffer(i) = SplitString(i)
        Next

Можно просто написать
Код

buffer = GPS_recieve.Split(New [Char]() {","c})



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Actionman
Дата 9.8.2011, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



Блин уже как тока не делал, все равно какая нить ошибка вылазит!!!


Вот например не и спользую если массив дополнительный(скрин ниже)

Код:

Код

Private Sub mySerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
        'Handles serial port data received events
        Dim i As Integer
        UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf UpdateDisplay)
        'n = mySerialPort.BytesToRead  'find number of bytes in buf
        'buffer = New Byte(n - 1) {} 're dimension storage buffer
        'mySerialPort.Read(buffer, offset, count) 'read data from the buffer
        GPS_recieve = mySerialPort.ReadExisting()
        Dim SplitString As String() = GPS_recieve.Split(New Char() {","c})
        Me.Invoke(UpdateFormDelegate1) 'call the delegate
    End Sub

    Private Sub UpdateDisplay()

        TextBox1.Text = SplitString(0)
        TextBox2.Text = SplitString(1)
        TextBox3.Text = SplitString(2)
        TextBox4.Text = SplitString(3)
        TextBox5.Text = SplitString(4)
        TextBox6.Text = SplitString(5)

        'TextBox1.Text = buffer(0)
        'TextBox2.Text = buffer(1)
        'TextBox3.Text = buffer(2)
        'TextBox4.Text = buffer(3)
        'TextBox5.Text = buffer(4)
        'TextBox6.Text = buffer(5)

    End Sub



при создании прототипа вообще в текстовых окнах ничего нету!

Добавлено через 11 минут и 2 секунды
Цитата(diadiavova @ 9.8.2011,  10:25)
А зачем в данном случае вообще копировать массив поэлементно, когда метод Сплит возвращает готовый строковый массив? Вместо вот этого
Код

        Dim SplitString As String() = GPS_recieve.Split(New [Char]() {","c})
        n = SplitString.Length - 1
        For i = 0 To n
            buffer(i) = SplitString(i)
        Next

Можно просто написать
Код

buffer = GPS_recieve.Split(New [Char]() {","c})

немного подправил щас, как и ты писал сделать, снова ошибка, при внесении параметра в текст. окно, Индекс находился вне границ массива.

Это сообщение отредактировал(а) Actionman - 9.8.2011, 15:56

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  ______.JPG 162,97 Kb
PM MAIL   Вверх
krewin
Дата 9.8.2011, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 27.8.2009

Репутация: 1
Всего: 1



Можешь использовать Function вот простой пример

Код

 Sub Main()
        Dim a() As String = RED()
    End Sub

    Function RED() As String()
        Dim ddd(1) As String
        ddd(0) = "1"
        ddd(1) = "2"
        Return ddd
    End Function



затем так замени

Код

Function mySerialPort_DataReceived() As String()
               Dim i As Integer
        UpdateFormDelegate1 = New UpdateFormDelegate(AddressOf UpdateDisplay)
             GPS_recieve = mySerialPort.ReadExisting()
        Me.Invoke(UpdateFormDelegate1) 'call the delegate
        Return GPS_recieve.Split(New Char() {","c})
    End Function


но а тут так

Код

 Private Sub UpdateDisplay()

 Dim a() As String = mySerialPort_DataReceived()

        TextBox1.Text = a(0)
        TextBox2.Text = a(1)
        TextBox3.Text = a(2)
        TextBox4.Text = a(3)
        TextBox5.Text = a(4)
        TextBox6.Text = a(5)

        'TextBox1.Text = buffer(0)
        'TextBox2.Text = buffer(1)
        'TextBox3.Text = buffer(2)
        'TextBox4.Text = buffer(3)
        'TextBox5.Text = buffer(4)
        'TextBox6.Text = buffer(5)

    End Sub
 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0614 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.