2012-02-10 60 views
0

我想從串行端口拆分輸入數據,並用隨後的數據更新文本框。我首先看看'$'是否可以分割,如果分割後的下一個單詞是「GPGGA」。如果是的話,我想從這句話中提取數據,其中','作爲分隔符。 現在,如您所見,我首先更新由串行端口讀取的全部數據,並且此工作正常。顯示包含「GPGGA」行的完整句子。但是在我分割它之後,包含「GPGGA」的句子部分看起來像這樣的「GPGGA,1 \ 0 \ 0 \ 0 \ 0 \ 0 ...」之前的盒子是「GPGGA,160333 ,,, ......」。我絕對肯定,在句子中有一個GPGGA後面的值,但是當我嘗試在調試模式下查看它時,字符串'ser_data',因此它的後續子字符串都顯示相同的垃圾。因此,我想要更新的最終文本框不可避免地最終只顯示1.串行端口讀取正常,但分配的字符串有垃圾,C#

有誰能告訴我爲什麼會發生這種情況,以及我如何糾正它。我急需我的論文工作。

感謝, 佈雷特

P.S:我已經把它貼下面的代碼。

private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     byte[] bData = null; 
     bData = new byte[40]; 
     serialPort.Read(bData, 0, 40); 
     string ser_data = System.Text.Encoding.GetEncoding("utf-8").GetString(bData); 
     txtAck.Invoke(new UpdateTextCallback(this.UpdateTextAck), new object[] { ser_data }); 
     string[] str = null; 
     str = new string[40]; 
     string[] str_ack = null; 

     str = ser_data.Split('$'); 
     if (str.Length > 1) 
     { 
      for (int i = 1; i < str.Length; i++) 
      { 
       string temp1 = null; 
       temp1 = str[i]; 
       if (temp1.StartsWith("GPGGA")) 
       { 
        string[] temp2 = null; 
        temp2 = temp1.Split(','); 

        StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true); 

        if (temp2.Length > 1) 
        { 
         string Time_GPS = temp2[1]; 
         txtEasting.Invoke(new UpdateTextCallback(this.UpdateTextEast), new object[] { Time_GPS }); 
         string text = "Time : " + Time_GPS; 
         // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true); 
         objWriter.WriteLine(text); 
        } 
        if (temp2.Length > 2) 
        { 
         string Lat = temp2[2]; 
         txtLatitude.Invoke(new UpdateTextCallback(this.UpdateTextLat), new object[] { Lat }); 
         string text = " Latitude : " + Lat; 
         // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true); 
         objWriter.WriteLine(text); 
        } 
        if (temp2.Length > 4) 
        { 
         string Long = temp2[4]; 
         txtLongitude.Invoke(new UpdateTextCallback(this.UpdateTextLong), new object[] { Long }); 
         string text = " Longitude : " + Long; 
         // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true); 
         objWriter.WriteLine(text); 
        } 
        if (temp2.Length > 9) 
        { 
         string Alt = temp2[9]; 
         txtNorthing.Invoke(new UpdateTextCallback(this.UpdateTextNorth), new object[] { Alt }); 
         string text = " Altitude : " + Alt; 
         // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true); 
         objWriter.WriteLine(text); 
        } 
        string Text = "." + '\n'; 
        objWriter.WriteLine(Text); 
        objWriter.Close(); 

        temp2 = null; 
        flag_status = 0; 
       } 
       temp1 = null; 
      } 
     } 
     str = null; 

回答

2

SerialPort.Read不一定讀取您要求的字符數。

您需要保存返回值,即讀取的字符數。

// nBytesRead will be between 0 and 40, depending on how many bytes were waiting. 
    int nBytesRead = serialPort.Read(bData, 0, 40); 
    // Only decode the number of bytes actually retrieved. 
    string ser_data = System.Text.Encoding.GetEncoding("utf-8").GetString(bData, 0, nBytesRead); 
+0

嗨,本,請您詳細說明。我應該怎麼做? – Brett 2012-02-10 11:48:12

+0

@brett,展開。 – Ben 2012-02-10 11:52:43

+0

serialPort.Read會返回它讀取的字節數。如果你使用超過這個字節的任何字節,它們將是垃圾(零,或者如果你重新使用相同的緩衝區,過去收到的更長的消息片段) – 2012-02-10 11:53:32

1

固定和主要清理。這假定兩件事:你的編碼是真正的UTF-8,並且你的行以換行符結束。

private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    serialPort.Encoding = ASCIIEncoding.UTF8; 
    string ser_data = serialPort.ReadLine(); 
    txtAck.Invoke(new UpdateTextCallback(this.UpdateTextAck), new object[] { ser_data }); 

    string[] str = ser_data.Split(new char[] { '$' }, 2); 
    if (str.Length > 1) 
    { 
     for (int i = 1; i < str.Length; i++) 
     { 
      string temp1 = str[i]; 
      if (temp1.StartsWith("GPGGA")) 
      { 
       StreamWriter objWriter = new StreamWriter(@"D:\Server.txt", true); 
       try 
       { 
        string[] temp2 = temp1.Split(','); 
        if (temp2.Length > 1) 
        { 
         string Time_GPS = temp2[1]; 
         txtEasting.Invoke(new UpdateTextCallback(this.UpdateTextEast), new object[] { Time_GPS }); 
         string text = "Time : " + Time_GPS; 
         // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true); 
         objWriter.WriteLine(text); 
        } 
        if (temp2.Length > 2) 
        { 
         string Lat = temp2[2]; 
         txtLatitude.Invoke(new UpdateTextCallback(this.UpdateTextLat), new object[] { Lat }); 
         string text = " Latitude : " + Lat; 
         // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true); 
         objWriter.WriteLine(text); 
        } 
        if (temp2.Length > 4) 
        { 
         string Long = temp2[4]; 
         txtLongitude.Invoke(new UpdateTextCallback(this.UpdateTextLong), new object[] { Long }); 
         string text = " Longitude : " + Long; 
         // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true); 
         objWriter.WriteLine(text); 
        } 
        if (temp2.Length > 9) 
        { 
         string Alt = temp2[9]; 
         txtNorthing.Invoke(new UpdateTextCallback(this.UpdateTextNorth), new object[] { Alt }); 
         string text = " Altitude : " + Alt; 
         // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true); 
         objWriter.WriteLine(text); 
        } 
        objWriter.WriteLine(".\n"); 
       } 
       finally 
       { 
        objWriter.Close(); 
       } 

       flag_status = 0; 
      } 
     } 
    } 
} 
+0

謝謝Zenexer ... – Brett 2012-02-10 12:12:03