2011-10-06 53 views
0

我遇到的問題可能主要是因爲我在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 1 023,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,我都會收到錯誤。它說「索引超出了數組的範圍」。現在如果有另一種獲取數據的方式,請給我建議。謝謝

+0

你試過什麼代碼來得到'y1'?你已經把它從這個例子中刪除了,但'y1 = Val(strarr(1))'* should *工作。 – ChrisF

+0

我確實使用了這個代碼y1 = Val(strarr(1)),但y1被聲明爲double。現在是這個原因或其他我不知道。但它給了我「索引超出數組範圍」的錯誤。 – Shuvo

+0

我沒有包括聲明,但假設'y1'被正確聲明。 – ChrisF

回答

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做字符串 - >雙重轉換。如果字符串不是數值,這將失敗。然後你可以使用你的double值。

如果當前行失敗了這些測試,則只需讀取下一行並重復。

+0

昏暗STR1作爲字符串 STR1 = sp1.ReadLine txtreceive.AppendText(STR1) 昏暗strarr作爲字符串()= str1.Split( 「」) 昏暗X1作爲雙人 昏暗Y1爲雙 X1 =纈氨酸(strarr(0)) y1 = Val(strarr(1))使用此代碼,但出現相同的錯誤。我沒有用一個小程序檢查代碼,通過將字符串分解成我的願望,代碼在那裏工作。但在這裏我得到這個錯誤。是否有其他方式從數據流中獲取座標? – Shuvo

+0

@Shuvo - 我想我起初的語法錯誤(VB.NET不是我的主要語言)。正如我所說的,仔細檢查你的數組是否包含8個元素,然後調用split。 – ChrisF

+0

我認爲你發佈了正確的語法,我嘗試了一個小應用程序,工作正常。

Dim a As String a = "0,2 1023,1023 1023,1023 1023,1023" Dim asep(4) As String asep = a.Split(",") MsgBox(Val(asep(0))) MsgBox(Val(asep(1)))
...我不知道我的主應用程序有什麼問題,相同的codeblock給我錯誤。 – Shuvo

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