Laden...

Problem mit SerialTools

Erstellt von Silver78 vor 19 Jahren Letzter Beitrag vor 19 Jahren 2.692 Views
Silver78 Themenstarter:in
40 Beiträge seit 2005
vor 19 Jahren
Problem mit SerialTools

Ich habe eine kleines Problem, ich greife mit SerialTools auf die serielle Schnittstelle zu. Hierbei werden Byte Arrays in strings umgewandelt und an den Port gesandt. Es werden dann auch Werte empfangen. Nun ist es so, dass ich eine Schleife mit 10 Durchläufen brauche und sobald der richtige Wert vom Port zurückgeliefert wir soll die Schleife abbrechen. Nur irgendwie funktioniert das mit einer if-Anweisung nicht so recht. Es wird der richtige Wert zurück geliefert, aber die Schleife bricht nicht ab. Kann es sein, dass der Schleifendurchlauf so schnell ist, dass dieser fertig ist, bevor die Werte vom Port zurückgeliefert werden? Wie schaffe ich es, dennoch bei einem richtigem Wert die Schleife abzubrechen?

Gruß Silver78

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Silver78,

wenn du weißt, dass genau 10 Schleifendurchläufe erfolgen sollen, dann riecht das für mich nach:


for (int i = 0; i < 10; ++i)

und nicht nach if.

Ansonsten gibt es bei IO im Allgemeinen eigentlich immer Methoden, die warten bis das nächste Zeichen zur Verfügung steht und welche, die sofort zurückkehren und per Rückgabe klar machen, dass gerade nichts ansteht. Das sollte aber aus der Doku hervorgehen. Schau doch mal.

herbivore

381 Beiträge seit 2004
vor 19 Jahren

i ≤ 10 vielleicht?

Mit freundlichen Grüßen

René Paschold
.NET Developer / Trainer / Speaker / Author /
Projectleader / Software-Architect


.blog http://www.rene-paschold.de/
.business http://www.smarthouse.de/

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Rene,

nein, schon echt kleiner 10, denn die Schleife startet ja in guter alter Tradition bei 0.

herbivore

Silver78 Themenstarter:in
40 Beiträge seit 2005
vor 19 Jahren

Ich habe eine for Schleife und am Anfang der Schleife noch eine if-Abfrage, in der ich den zurück gelieferten Byte-Array abfrage.

z.B:

for (int i=0; i<10;i++)
{
if(byteString[0] == "50")
break;
.
.
.
.
}

Ich hatte gehofft, dass die Schleife abgebrochen wird, falls der Port in den Byte-Array "50" zurückliefert. Aber obwohl der Port die "50" sendet bricht die Schleife nicht ab.

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo Silver78,

postet mal bitte noch den restlichen Code vor und in der Schleife.

Vorab schon mal, warum sprichst du von ByteArray, aber dann ist es doch ein StringArray? Kann es daran liegen? Und warum ist es byteString[0] und nicht byteString_?

Naja, poste mal den Code, wenn es daran nicht liegt.

HTH

herbivore

P
939 Beiträge seit 2003
vor 19 Jahren

Es wird daran liegen, dass der String noch weitere, nicht sichtbare Zeichen enthält (\r\n). Lass dir mit string.Length die Länge ausgeben.

... oder ist byteString etwa ein String? .. nee, kann nicht sein.

Im Zweifelsfall einfach mal den Debugger verwenden.

Gruss
Pulpapex

Silver78 Themenstarter:in
40 Beiträge seit 2005
vor 19 Jahren

Also ich kann an den Port nur Strings schicken und empfangen. Ich brauche jedoch meine Daten als Hex Werte und somit wandle ich den empfangenen String erst in ein ByteArray um, um dann damit weiter arbeiten zu können. Danach konvertiere ich den ByteArray mit Convert.ToString(ByteArray_, 16) wieder in einen String um so die Hex Darstellung zu bekommen. Und diesen "Hex"string überprüfe ich dann, jedoch brauche ich nur den StringArray[0], der Rest ist egal....also der erste String muss stimmen, dann soll abgebrochen werden. Denn Code habe ich derzeit leider nicht zur Hand.

Die übergebenen Werte sind alles korrekt, nur wie gesagt wird die Schleife nicht abgebochen.

Gruß Silver78

P
939 Beiträge seit 2003
vor 19 Jahren

Warum nochmal in einen String wandeln?
Ist doch einfacher so zu testen:

byte b0 = byteArray[0];
if(b0 == (byte)0x50) {
  break;
}
A
7 Beiträge seit 2004
vor 19 Jahren

UUUuuuups! Vorheriger Beitrag war ja managed C++! Mal nen C#-Versuch:

Hallo!

Kann es evtl. daran liegen, dass das mit dem "" Operator nicht so funktioniert, wie gewollt? Macht der bei "" nicht nen Referenzvergleich. Versuche mal Equals vom String zu verwenden.

if (myString.Equals(new String("50"))) ...

So in dem Stil.
Wenn das nicht läuft und evtl. noch andere Zeichen drin stehen sollten, dann versuche einfach StartsWith vom String zu verwenden.

if (myString.StartsWith(new String("50"))) ...

Nun ja. Wenn eine der Varianten klappt, dann kannste auch nochmal schauen, ob das auch so geht:

if (myString.Equals("50")) ...
ODER
if (myString.StartsWith("50")) ...

Ciao
ariaci