2015-04-03 167 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