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!
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
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.
@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...
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.
@Simon K. , Danke für die Info!!! werde ich machen wenn der Fehler da ist, teste gerade...
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);
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.