Forum: PC-Programmierung C# Serialport.bytesToRead.


von Martin (Gast)


Lesenswert?

Hallo Forum!


Ich habe ein kleines Problem wo ich nicht weiss wie ich das Lösen soll.

Eine I/O Platine (Atmega88) sendet nach einer Anfrage vom PC die 
Zuständer aller I/Os zurück. Das funktioniert sehr gut, aber ! Wenn ich 
das lange zeit laufen lass (über nacht) dann hängt sich das c# prog auf!

Ich baue mir einen String aus allen bytestoread zusammen und wenn ein 
return (0x0D) kommt dann ist der string fertig.

C# schreibt den Fehler: BytesToRead buffer ist voll

Ein Fehler vom Atmel ist ausgeschlossen! Es liegt am C#

buffer auslesen und in einen String schreiben:

private void 
ser_int(objectsender,System.IO.Ports.SerialDataReceivedEventArgs e)
        {

            byte[] buffer = new byte[this.serialPort1.BytesToRead];

                this.serialPort1.Read(buffer, 0, 
this.serialPort1.BytesToRead);

            for (int i = 0; i < buffer.Length; i++)
            {
                if (buffer[i] == 0x0D) input_ok = true;
                tempstring += ((char)buffer[i]);  // tempstring globale 
Variable
            }
        }


Danke!

von Benjamin U. (utzus)


Lesenswert?

Martin schrieb:
> C# schreibt den Fehler: BytesToRead buffer ist voll

ist das der genau Wortlaut der Fehlermeldung? Und in welcher Zeile tritt 
er auf? in der ersten oder zweiten?

Es gibt in C# Try and Catch, die kommen da normalerweise immer drum, um 
solche Fehler abzufangen. Vielleicht ist es ja diese Exception:

ArgumentNullException   Der übergebene Puffer ist null.

Ich weiß ja nicht, wie C# das händelt, aber, angenommen es kommt ein 
Byte am PC an, aber es passt das Framing nicht, also z.B. falsches 
Parity oder sowas. C# verwirft es also, es kommt in keinen Puffer, aber 
es wird trotzdem der Servicehandler aufgerufen, dann wird dein Puffer 
mit der länge 0 initialisiert. Also ich weiß nicht, ob das so bei C# 
laufen kann, hab damit schon lange nix mehr gemacht.

Aber mit TryCatch könntest du dein Problem lösen

von Peter II (Gast)


Lesenswert?

ich vermute einfach mal das der Buffer wirklich voll ist. Du also 
irgendetwas anderes in der Zeit gemacht hast, das der Hauptthtread keine 
zeit hatte davon abzurufen.

von Martin (Gast)


Lesenswert?

@Benjamin
C# schreibt dass der Buffer voll ist, mit try habe ich es schon getestet 
aber da hängt es dann auch.

Jetzt habe ich es mal so programmiert wenn der Buffer größer ist als 
erlaubt dann wird er gelöscht (null)

jetzt läuft es mal, muss warten bis morgen...

von Simon K. (simon) Benutzerseite


Lesenswert?

Martin schrieb:
> @Benjamin
> C# schreibt dass der Buffer voll ist
C# kann nichts schreiben, da es eine Programmiersprache ist. Mach einen 
Screenshot, wenn es für dich zu schwer ist den Text der Fehlermeldung zu 
kopieren.

von Martin (Gast)


Lesenswert?

@Simon K. , Danke für die Info!!!

werde ich machen wenn der Fehler da ist, teste gerade...

von Eddy C. (chrisi)


Lesenswert?

Das ja schon an Vorsatz:

byte[] buffer = new byte[this.serialPort1.BytesToRead];
this.serialPort1.Read(buffer, 0, this.serialPort1.BytesToRead);

Was wenn sich BytesToRead vom einen auf das andere mal erhöht? Wenn dann 
schon:

int BytesToRead = this.serialPort1.BytesToRead;
byte[] buffer = new byte[BytesToRead];
this.serialPort1.Read(buffer, 0, BytesToRead);

von bluppdidupp (Gast)


Lesenswert?

Wenn es sich ohnehin um Zeichen und nicht Bytes handelt, würde ich 
einfach das serialPort1.Encoding Property passend setzen und im 
DataReceived-Handler einfach:
1
tempstring+=serialPort1.ReadExisting();

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.