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
Gast #2691826
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...
#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);
Gast #2691997
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();

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