Laden...

Serial Port BytesToRead wird falsch verarbeitet

Erstellt von carmani vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.452 Views
C
carmani Themenstarter:in
274 Beiträge seit 2008
vor 15 Jahren
Serial Port BytesToRead wird falsch verarbeitet

Hei Leute!

Ich lese vom Serial Port Daten aus. Wenn BytesToRead 0 ist soll er aus einer schleife
hüpfen. Dies üerwache ich wie folgt:


if (com_port.BytesToRead == 0)

aber er hüpft immer egal wie groß BytesToRead ist in die Bedingung. Weis jemand warum das so ist?

Lg

Gelöschter Account
vor 15 Jahren

da das ganze asynchron von statten geht, kann es sein, das zu dem zeitpunkt der prüfung tatsächlich keine bytes mehr zum lesen da waren aber zu dem zeitpunkt, als du es dir angeschaut hast wieder daten da waren.

C
carmani Themenstarter:in
274 Beiträge seit 2008
vor 15 Jahren

wenn ich einen Brakepoint setze hat BytesToRead aber einen Wert also müsste er den ja auch zuweisen. Oder nicht. Es ist jedenfall so dass noch Daten zum lesen da wären aber dadurch das BytesToRead falsche Werte zurück gibt nichts ausgelesen wird.

Gelöschter Account
vor 15 Jahren

nochmals: wenn du einen breakpoint setzt und dir die varibale ansiehst, kann sie sich in der zwischenzeit verändert haben.

C
carmani Themenstarter:in
274 Beiträge seit 2008
vor 15 Jahren

setz den brakepoint aber nach der codzeile

alos so

com_port.Read(recieve_data_arr, 0, recieve_data_arr.Length+(47*count));
anz=com_port.BytesToRead;

Breakpoint.

Und dann müsste anz den richigen wert haben. es ist devinitiev so dann noch was zum lesen da ist aber er nichts liest weil er anz falsch beschreibt!

Gelöschter Account
vor 15 Jahren

Da die SerialPort-Klasse Daten puffert, der in der BaseStream-Eigenschaft enthaltene Stream jedoch nicht, gibt es möglicherweise Konflikte dahingehend, wie viele Bytes gelesen werden können. Die BytesToRead-Eigenschaft kann angeben, dass zwar Bytes zum Lesen vorhanden sind, der in der BaseStream-Eigenschaft enthaltene Stream aber möglicherweise nicht auf diese Bytes zugreifen kann, da sie in der SerialPort-Klasse gepuffert wurden.

C
carmani Themenstarter:in
274 Beiträge seit 2008
vor 15 Jahren

Ja das alles Hilft mir leider nicht weiter!

Mein Problem ist folgendes:

Ich Habe ein Protokoll mit 47 Byte (feste Länge). Ich bekomm zwei hinter einander (also 94 Byte). Und will beide auslesen, hintereinander!

count erhöhe ich um 47 nach dem ersten durchgang und recieve_arr_size ist 47.
beim zweiten mal hüpft er a ber immer ins ctach ich hab aber keinen plan warum und die exception kann ich warum auch immer auch nicht abfragen

try { com_port.Read(recieve_data_arr, count, recieve_arr_size); }
catch (Exception a){ }

Irgendwer ne Ahnung warum?

Gelöschter Account
vor 15 Jahren

wenn du aber count um 47 erhöhst dann haben wir doch den fehler. dur schreibst ja weiter oben: "recieve_data_arr.Length+(47count)" also 4747

185 Beiträge seit 2005
vor 15 Jahren

jedes Serielle Protokoll, daß ich bis jetzt verarbeitet habe, hat ein Start und ein Endezeichen.

Ich habe eine Variable oder ein array daß ich mit den empfangenen Daten fülle.
Beim Startzeichen wird die Variable/array gelöscht, und beim Endezeichen in eine Queue geschrieben.
Somit kann auch mehr wie 1 Datensatz auf einmal eingelesen werden.
Erst dann prüfe ich die Daten.
Wer garantiert dir, daß nicht ein Zeichen irgendwo verloren geht?