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
es ist eine Art von Multi-Threading-Problem –
Jede Ahnung, wie ich lösen kann es –
den Code Sie die Zeichenfolge erhalten verwenden hinzuzufügen. Verwenden Sie ReceiveData-Ereignis? – McNets