BufferedReader.readLine erkennt Zeilenende nicht

Hallo,

ich schreibe über einen Mikrocontroller, auf dem ein C Programm läuft, auf die serielle Schnittstelle eine Zeichenkette, die mit einem Zeilenumbruch beendet wird. In meiner Java-Anwendung möchte ich den InputStream über einen BufferedReader.readLine() auswerten.

Da readLine() aber aus irgendeinem Grund den Zeilenumbruch am Ende nicht erkennt, wird folgende Exception geworfen:

java.io.IOException: Underlying input stream returned zero bytes
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:268)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
:

In C verwende ich als Zeilenumbruch '\n' (also 0x0A und 0x0D), habe aber auch schon \r\n probiert (was auch nicht funktioniert hat).

Das C-Programm habe ich mit PuTTY getestet, das \n wird dort auch zu einem Zeilenumbruch. Die Java-Applikation funktioniert auch wenn ich in PuTTY irgendetwas hineinschreibe und Enter drücke, aber miteinander funktionieren die beiden nicht ...

;(

mfg
kabellutscher
 
Hallo,

kenne mich mit dem Thema eigentlich nicht aus, aber wenn ich mir die Fehlermeldung ansehe, könnte das Problem doch eher daran liegen, daß im ImputStream keine Zeichen vorhanden sind ->
Code:
Underlying input stream returned zero bytes
. Vielleicht klappt die Verbindung mit der seriellen Schnittstelle nicht richtig.

MfG
hansmueller
 
Ich habe es jetzt so probiert, dass ich die Übertragung im C-Programm mit '$' beende. In Java habe ich Zeichen für Zeichen mit InputStream.read() eingelesen und nach '$' abgefragt, das funktioniert soweit. Der InputStream ist also nicht leer, BufferedStream.readLine() liefert wahrscheinlich erst ein Ergebnis, wenn es einen Zeilenumbruch erkannt hat, und das tut es nicht ...

Schön langsam bin ich mit meinem Latein am Ende, 0x0A und 0x0D in C sind wohl auch in Java 0x0A und 0x0D, oder? ???:L
 
Hallo,

ich weiß jetzt, was du falsch machst.

\n ist eine sogenannte Escape-Sequenz, die nur im Quellcode verwendet wird.

Du darfst nicht 0x0A und 0x0D verwenden, denn das sind die Zeichen "\" und "n", sondern den echten Zeilenumbruch bzw. das Steuerzeichen dafür. (habe ich gerade nicht zur Hand.)

NACHTRAG: Habe gerade nachgeschlagen, 0x0A und 0x0D sind tatsächlich die Zeichen für Zeilenvorschub und Wagenrücklauf. War etwas vorschnell. Also vergiß den Müll wieder, den ich geschrieben habe. Sorry 😳

MfG
hansmueller
 
Zuletzt bearbeitet:
Hallo,

ich habe eine andere Idee.

Wenn du schon ein Testprogramm hast, mit dem du Zeichen für Zeichen lesen kannst, dann teste doch einfach, was Java bei dem Zeichen für den Zeilenumbruch ausgibt.

MfG
hansmueller
 
muss der reader denn das ende selbst kennen. wäre sicher nur n workaround (denn eigentlich sollte das mit readline ja klappen) aber kannst du nicht die zeichen mit read() einzelnd lesen und den zeilenunbruch selber suchen?
 
Vorweg sei mal gesagt, dass \n == 0x0a, und \r == 0x0d. Im ersten Post steht das gänzlich falsch.

Ansonsten kann man nachd er Zero-Bytes-Meldung auch einfach googlen, und findet dann das hier: [Rxtx] Underlying input stream returned zero bytes

Wenn du im C-Code \r\n sendest, dann sollte das von Java auf jeden Fall erkannt werden. Das Problem wird wohl er sein, dass Java so schnell liest, das noch keine neue Daten da sind und dann vom RXTX der genannte Fehler geschmissen wird.
 
Ich habs jetzt noch einmal mit DataInputStream.readLine() probiert, ist zwar daprecated, funktioniert aber!

@HoaX: in C wird \n zu 0x0A und 0x0D, in Java ist das anders

Das einzige Problem, das ich jetzt noch habe, ist das bei der Übertragung immer die ersten Paar Zeichen verloren gehen. Sind den die Bytes in einem InputSteram nicht automatisch gepuffert?
 
Vielleicht ist es dann einfacher, wenn du das C-Programm eine Datei erstellen lässt, die du mit dem Java-Programm einliest. Falls das bei deiner Aufgabenstellung möglich ist.
 
Originalbeitrag wegen Verletzung der Forumregeln und der Netiquette entfernt.

ja is klar ihr ***** mods ... geht einfach sterben ...
nur weil ichs so entnervt geschrieben hab weil so viele immer noch so ******* sind und nich mal googlen löscht ihr gleich wieder wahllos meine threads ...

***** euch einfach mal ...
Und genau wegen diesen verbalen Entgleisungen, werden auch alle weiteren Threads gelöscht werden, die du in einer solchen Form veröffentlichst.
Man kann sich auch im Griff haben, wenn andere Laute nicht so sind oder reagieren, wie man es persönlich von ihnen erwarten würde.

Und von dir erwarte ich, dass du, wenn es dir hier nicht gefällt, einfach nicht mehr her kommst.
Du kannst dir 'ne Menge Ärger sparen - in deinem eigenen Interesse.
 

Zurück
Oben