2015-04-03 166 views
1

該字符串使用逗號作爲分隔符分割。每次打印字符串時,它都會以不同的順序出現。字符串是可變的: '字符串:Z1,TA,H999.00,T999.00' 它成功地分割,但即使字符串完全相同,當打印數組時,我們會得到隨機的新行和隨機數據缺失。數組隨機分割字符串

當打印到文本框其任一正確地分割,或像: -Z1 -T -H999.00 -T999。 -00 如果循環再次運行,我們會得到不同的結果。奇怪的是,它正確顯示。

我認爲它的這個代碼:(編輯:它不是)

string[] ArrayCleanDataRX = CleanDataRX.Split(','); 
foreach (string EntireList1 in ArrayCleanDataRX) 
    { 
    TxtZ1.AppendText(EntireList1); 
TxtZ1.AppendText("\n"); 
} 

任何建議將是輝煌的。 謝謝。

UPDATE:(尚未解決) 更新2:更多的代碼 - 的問題是忽略了簡化問題

#region Global Strings 
    public string DirtyDataRX;             //String contains Data from Serial 
    public string Z1 = "Z1";              //String to check if Data from serial Contains Z1 
private void FeedbackProcessing(object sender, EventArgs e) 
    { 
     TxtDirtyDataRX.AppendText(DirtyDataRX);         //Populate TxtDirtyTest with DirtyText String 


     var CleanDataRX = DirtyDataRX;            //Clean Data = Dirty Text 
     var charstoremove = new string[] { "|", "-", "%", " ", " ", " ", "~", "$", "?", "'", ".,", "..,", "..", "..:", ".:", "...", "....", ".....", "......", "......", "......", "-" }; // Contents of CharsToRemove (Removes Bad Charecters from raw serial) 
     foreach (var c in charstoremove)           //C is Char(s) to remove 
     { 
      CleanDataRX = CleanDataRX.Replace(c, string.Empty);     //Replace C in CleanDataRX with nothing.    
     } 

     TxtCleanDataRX.AppendText(CleanDataRX);         //Show DirtyDataRX in DirtyDataRX Textbox 

     #region IfZones and Array Loops 
     if (CleanDataRX.Contains(Z1))             // If CleanDataRX Contains "Z1" Run Code 
     { 
      string[] ArrayZ1 = CleanDataRX.Split(',');       //New String Array from CleanDaraRX. Split using Comma as Delimiter 

      foreach (string StrArrayZ1 in ArrayZ1)        // New string Called StrArrayZ1 in ArrayCleanDataRX 
      { 
       TxtZ1.AppendText(StrArrayZ1);          //Append Textbox with String Array, Loop untill Empty 

      } 
     } 

#region DirtyRX 
    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 

     DirtyDataRX = serialPort1.ReadExisting(); 
     this.Invoke(new EventHandler(FeedbackProcessing)); 
    } 
    #endregion 

的代碼,我認爲這是irelevent。 注意:某些數組名稱已被稍微編輯..

+0

是'ArrayCleanDataRX1'在你的問題中的錯字?上面的變量是'ArrayCleanDataRX'沒有1末尾 – Nathan 2015-04-03 23:33:55

+0

感謝隊友,錯字,但不是問題。將近午夜油! – 2015-04-03 23:50:05

+0

您是否能夠發佈出現的整個方法?這可能是有保證的,這很奇怪。 – DWright 2015-04-04 00:54:21

回答

0

感謝您的幫助。問題解決了我自己... 這不完全是循環,或拆分...對不起。 這可能會幫助其他人...... 錯誤正在被拋出,因爲正在積極建立字符串。的問題是在數據是如何在讀的serialport方法讀,這是它是怎麼:

DirtyDataRX = serialPort1.ReadExisting(); 
this.Invoke(new EventHandler(FeedbackProcessing)); 

作爲通過被面向行的.ReadLine應使用傳來的數據....

 DirtyDataRX = serialPort1.ReadLine(); 
     this.Invoke(new EventHandler(FeedbackProcessing)); 

使用ReadLine代替解決了手頭的問題。

0

代碼的這種安寧不足以回答問題。但是,如果您使用多線程,則必須使用鎖來避免危險結果。

實施例:

lock(TxtZ1) 
{ 
    string[] ArrayCleanDataRX = CleanDataRX.Split(','); 
    foreach (string EntireList1 in ArrayCleanDataRX1) 
    { 

      TxtZ1.AppendText(EntireList1); 
      TxtZ1.AppendText("\n"); 
    } 
} 
+0

多線程未被使用。 ,謝謝。 無法發佈代碼作爲其論文項目。現在,它看起來像這樣:「Z1,TA,H999.00,T999.00」 我發佈的代碼應該使用逗號作爲分隔符分割CleanDataRX,然後插入到數組中。最後,打印陣列 – 2015-04-03 23:41:04

0

TxtZ1是一個文本框?

那麼你應該寧願做類似:

string[] ArrayCleanDataRX = CleanDataRX.Split(','); 
StringBuilder sb = new StringBuilder(); 
foreach (string EntireList1 in ArrayCleanDataRX) 
{ 
    sb.AppendLine(EntireList1); 
} 

TxtZ1.AppendText(sb.ToString()); 

我想這也將解決這個問題,如果你使用Environment.Newline不是\ n個。奇怪的事情往往發生在\ n在Windows控件...

+0

雖然這樣做會產生結果,但它會顯示數組中缺失的數據。 。 使用environment.newline時,如 TxtZ1.AppendText(sb.ToString()+ Environment.NewLine); 它仍然有同樣的問題....:/謝謝。 – 2015-04-05 12:04:47