2016-11-19 5 views
1

So habe ich an meinem C# -Projekt gearbeitet, das einige serielle Kommunikation erforderte. Alles hat gut funktioniert, bis ich ein wirklich ... komisches Problem habe.C# -Code wirkt falsch, es sei denn Debuggen

So gerade jetzt bekomme ich einen Code in der Reihe, die in myString gespeichert ist. Dann unten, wo ich das Problem bekomme, das ist, dass, wenn ich den Code nicht debugge, dann eine ganze if-Anweisung einfach ... ignoriert werde. Wenn ich jedoch einen Haltepunkt verwende, macht es alles richtig. Denn hier referance alles funktioniert, außer dem Teil (* l) (der Rest des Codes für unnötige Teile entfernt Ich kann mehr anhängen, wenn euch denken, kann es helfen..)

public delegate void AddDataDelegate(String myString); 
public AddDataDelegate myDelegate; 
// 
// 
this.myDelegate = new AddDataDelegate(AddDataMethod); 

// 
// 
private void Receiver(object sender, SerialDataReceivedEventArgs e) 
{ 
    Byte[] str = System.Text.Encoding.ASCII.GetBytes(comPort.ReadExisting()); 

    this.Invoke(this.myDelegate, new Object[] 
    { 
     System.Text.Encoding.Default.GetString(str) 
    }); 

} 
// 

private void button2_Click(object sender, EventArgs e) 
{ 
    if (connectionStatus.Text == "Connected") 
    { 
     comPort.Close(); 
    } 
    else 
    { 
     try 
     { 
      comPort.PortName = port; 
      comPort.BaudRate = baudRate; 
      comPort.DataBits = dataBits; 
      comPort.StopBits = (StopBits)stopBits; 
      comPort.Parity = parity; 
      comPort.DataReceived += new SerialDataReceivedEventHandler(Receiver); 

      comPort.Open(); 
      connectionButton.Text = "Disconnect"; 
      connectionStatus.Text = "Connected"; 

     } 
     catch 
     { 
      comPort.Close(); 
     } 
    } 
} 


public void AddDataMethod(String myString) 
{ 
    try 
    { 
     string colorSensorValue; 
     string distanceSensorValue; 
     string proximitySwitch; 
     string limitSwitch; 
     if (myString.Contains("*c*")) 
     { 
      string[] colors; 
      int red; 
      int blue; 
      int green; 
      int max; 
      colorSensorValue = myString.Substring(myString.IndexOf("*c*") + 3); 
      if (colorSensorValue.Contains("*e")) colorSensorValue = colorSensorValue.Substring(0, colorSensorValue.IndexOf("*e*")); 
      colors = colorSensorValue.Split(','); 
      red = Convert.ToInt16(colors[0]); 
      green = Convert.ToInt16(colors[1]); 
      blue = Convert.ToInt16(colors[2]); 

      max = Math.Max(red, Math.Max(green, blue)); 
      red = red * 255/max; 
      blue = blue * 255/max; 
      green = green * 255/max; 
      color.BackColor = Color.FromArgb(red,blue,green); 
      colorSensorTextBox.Text = (colorSensorValue); 
     } 
     if (myString.Contains("*d")) 
     { 
      distanceSensorValue = myString.Substring(myString.IndexOf("*d*") + 3); 
      if (distanceSensorValue.Contains("*e")) distanceSensorValue = distanceSensorValue.Substring(0, distanceSensorValue.IndexOf("*e*")); 
      distanceSensorTextBox.Text = (distanceSensorValue); 
     } 
     if (myString.Contains("*l")) 
     { 
      limitSwitch = myString.Substring(myString.IndexOf("*l*") + 3); 
      if (limitSwitch.Contains("*e")) limitSwitch = limitSwitch.Substring(0, limitSwitch.IndexOf("*e*")); 
      limitRead.Text = limitSwitch; 
     } 
     if (myString.Contains("*p")) 
     { 
      proximitySwitch = myString.Substring(myString.IndexOf("*p*") + 3); 
      if (proximitySwitch.Contains("*e")) proximitySwitch = proximitySwitch.Substring(0, proximitySwitch.IndexOf("*e*")); 
      proximityRead.Text = proximitySwitch; 
     } 

     comPort.BaseStream.Flush(); 

    } 
    catch 
    { 

    } 

} 

Beispiel myString:

*c*96,84,75*e**d*25.5*e**p*0*e**l*0*e* 

so wird es lesen, wie: Farben: 96, 84, 75 (geschieht rechts!) Entfernung: 25.5 (geschieht rechts!) prox: 0 (geschieht rechts!) Limit: 0 (passiert nicht ..)

zur Kenntnis, dass die Reihenfolge der beiden gesendeten und empfangenen Daten nicht ändert, welche (Grenze), die nicht, es sei denn ich

+0

es ist eine Art von Multi-Threading-Problem –

+0

Jede Ahnung, wie ich lösen kann es –

+0

den Code Sie die Zeichenfolge erhalten verwenden hinzuzufügen. Verwenden Sie ReceiveData-Ereignis? – McNets

Antwort

1

Nach der SerialPort Breakpoint funktioniert: Klasseninformation in MSDN:

Die DataReceived Veranstaltung wird in einem sekundären Thread ausgelöst, wenn die Daten vom SerialPort-Objekt empfangen werden. Da dieses Ereignis auf einem sekundären Thread und nicht dem Hauptthread ausgelöst wird, kann das Versuchen, einige Elemente in dem Hauptthread wie UI-Elementen zu ändern, eine Thread-Ausnahme auslösen. Wenn es erforderlich ist, Elemente im Hauptformular oder -steuerelement zu ändern, senden Sie Änderungsanforderungen zurück mit Invoke, die die Arbeit an dem richtigen Thread tun.

sollten Sie verwenden Sie dieses Formular verwenden:

this.Invoke(this.AddDataMethod, new Object[] { The_Received_String }); 
        } 
+0

Also füge ich einfach ".Parent" zu diesem Teil hinzu? –

+0

(Code erneut zu aktualisieren. Entschuldigung! (Es ist ein großer Code ..) –

+0

Es tut mir leid, ich kopierte und Einfügen von meinem Code.Ich habe eine allgemeine Zweckklasse. – McNets

Verwandte Themen