проблема с использованием полученных данных от последовательного порта - PullRequest
0 голосов
/ 07 октября 2011

проблема, с которой я столкнулся, возможно, в основном из-за того, что я новичок на VB.net, в любом случае, я могу успешно получать данные с микроконтроллера.Формат данных, поступающих с микроконтроллера, показан ниже

0,2 1023,1023 1023,1023 1023,1023

1,5 1023,1023 1023,1023 1023,1023

2,8 1023,1023 1023,1023 1023,1023

3,11 1023,1023 1023,1023 1023,1023

4,14 1023,1023 1023,1023 1023, 1023

5,17 1023,1023 1023,1023 1023,1023

здесь в основном микроконтроллер посылает мне координаты четырех разных точек в [x1, y1 x2, y2 x3, y3 x4,y4] format

теперь меня интересует использование только первой пары координат и, возможно, сохранение в двух разных массивах x1 и y1.Затем я хочу использовать эти две координаты в качестве экранных координат.

Public Class Form1
    Public Delegate Sub myDelegate()
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        sp1.Open()
    End Sub
    Public Sub updateTextBox()
        Dim strarr(8) As String
        Dim str1 As String
        str1 = sp1.ReadLine
        txtreceive.AppendText(str1)
        strarr = str1.Split(",")

        Dim x1 As Double      

        x1 = Val(strarr(0))

        MsgBox(x1)

        txtreceive.ScrollToCaret()

    End Sub

    Private Sub sp1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp1.DataReceived

        txtreceive.Invoke(New myDelegate(AddressOf updateTextBox), New Object() {})



    End Sub

    Private Sub txtreceive_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtreceive.TextChanged

    End Sub
End Class

здесь я получаю координату x первой пары, но всякий раз, когда я пытаюсь получить y1 из первой пары, я получаю ошибку.он говорит: «Индекс был за пределами массива».Теперь, если есть другой способ получения данных, пожалуйста, предложите мне.Спасибо

Ответы [ 2 ]

1 голос
/ 07 октября 2011

Здесь есть два разделителя:

  • символ пробела, который отделяет четыре пары друг от друга
  • символ запятой, который разделяет координаты X и Y

Если вы разделите запятыми JUST, ваши элементы будут такими же, как если бы вы набрали:

strarr(0) = "0"
strarr(1) = "2 1023"
strarr(2) = "1023 1023"
strarr(3) = "1023 1023"
strarr(4) = "1023"

Если вы хотите все четыре пары, сначала разбейте пробелы, а затем разбейте каждую изчетыре результирующие строки на запятых.

Поскольку вам нужна только первая пара, обрежьте строку в первом пробеле, а затем разделите ее на запятую, как показано ниже.

Public Sub updateTextBox()
    Dim strarr() As String
    Dim str1 As String
    str1 = sp1.ReadLine

    ' NEW: truncate str1 at the first space
    str1 = str1.SubString(0, str1.IndexOf(" ") -1)

    txtreceive.AppendText(str1)
    strarr = str1.Split(",")

    Dim x1 As Double
    Dim y1 As Double      

    x1 = Val(strarr(0))
    y1 = Val(strarr(1))

    MsgBox(x1 & ", " & y1)

    txtreceive.ScrollToCaret()

End Sub
0 голосов
/ 07 октября 2011

string.split() вернет массив правильного размера, поэтому ваше объявление об этом:

Dim strarr(8) As String

лишнее.

Следующий код должен разбивать строку на запятые.

Dim strarr() As String
strarr = str1.Split(",")

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

Используйте отладчик или окно сообщения, чтобы проверить, что строка данных, которую вы только что прочитали, имеет формат:

0,2 1023,1023 1023,1023 1023,1023

Если вы получаете другие данные, то проще всего сначала проверить, что возвращает string.Split.

Вы сказали, что первая строка:

Адрес ведомого: 0xB0 Инициализация успешна!

В этом случае массив будет только один, поскольку в этой строке нет запятых.

Однако у вас есть еще одна проблема: вам нужно сначала разделить пробелы, чтобы получить массив координат, а затем разделить на запятой. Итак, сначала вам нужно:

strarr = str1.Split(" ")

чтобы дать вам:

strarr(0) = "0,2"
strarr(1) = "1023,1023"
strarr(2) = "1023,1023"
strarr(3) = "1023,1023"

Затем убедитесь, что это правильная длина - 4, а затем разделите первый элемент на запятую.

Тогда, если это приводит к массиву длины 2, используйте TryParse, чтобы выполнить строку -> двойное преобразование. Это не будет безопасно, если строка не является числовым значением. Тогда вы можете использовать ваши двойные значения.

Если текущая строка не проходит эти тесты, просто прочитайте следующую строку и повторите.

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