C# Serialport.bytesToRead.

Gast #2691697
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!
#2691716
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
#2691951
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);

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren