使用从串口接收的数据的麻烦

时间:2011-10-06 21:36:37

标签: vb.net serial-port

我遇到的问题可能主要是因为我在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]格式的四个不同点的坐标

现在我感兴趣的是只使用第一对坐标,可能会保存在两个不同的数组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 个答案:

答案 0 :(得分:1)

这里有两个分隔符:

  • 空格字符,将四对彼此分开
  • 逗号字符,用于分隔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

答案 1 :(得分:0)

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来执行字符串 - >双重转换。如果字符串不是数值,这将失败安全。然后你可以使用你的双值。

如果当前行未通过这些测试,则只需读取下一行并重复。