Input Stream

Hey Leute,

mittlerweile funktioniert mein Input Stream. Allerdings verlässt er die
while-Schleife nicht mehr. Ich habe schon sämtliche Abbrechbedingungen
versucht. Vielleicht fällt dir/euch noch eine ein?

public void run()
            {
                try
                {
                    openConnections();
                    form.append("
 Sende AT-Befehle");

                    form.append("
 Sende AT**BINQ=2");
                    os.write("
\r AT**BINQ=2 
\r".getBytes("US-ASCII"));
                    os.flush();
                   
                    int n = 0;
                    StringBuffer sb = new StringBuffer();       
            while ((n = is.read()) != -1) 
            {
                sb.append((char) n);
                String result = sb.toString();
                form.append("
 InputStream:" + result);
            } 
            }
            // es folgt catch Block
          }

Er gibt nacheinander die Zeichen die ankommen, aus und dann bleibt er in
der Schleife hängen.

Bin für jeden Tipp dankbar!

Sannchen

Wo die Daten herkommen ist im Moment nicht ganz klar, aber was gibt er denn aus, wenn man mal ein

while ((n = is.read()) != -1)
{
    System.out.println("Zuletzt gelesen: "+n);
    sb.append((char) n);
...

einfügt?

Ich habe den Inputstream in der Methode openConnections(); geöffnet, daher sieht man das hier nicht so genau.

Wenn ich

    {
        System.out.println("Zuletzt gelesen: "+n);
        sb.append((char) n);
    ...```
einfüge, gibt er nach einander die ASCII Zeichen aus. Also für hallo sieht das so aus:
Zuletzt gelesen: 104
Zuletzt gelesen: 97
Zuletzt gelesen: 108
Zuletzt gelesen: 108
Zuletzt gelesen: 111
Zuletzt gelesen: 13

Allerdings verlässt er nicht Schleife.

-1 kommt erst wenn der Stream geschlossen wird/wurde

Das hieße, ich müsste den InputStream noch in der while-Schleife schließen?

Und wenn ich den nächsten Input erwarte, wieder öffnen?

nein, dann fliegt eine EndOfStreamException oder so komisch

du musst dir etwas neues ausdenken, wie du damit umgehst :wink:

Ich sitz heute schon den ganzen Tag daran und habe nur noch Fragezeichen im Kopf und in den Augen.:confused:

Kannst du mir bitte helfen? Ich hab keine Ideen mehr!

ich vermute mal du willst aus dem Stream lesen und das was du liest verarbeiten?
Dann mach einfach einen Thread auf der immer aus dem Stream liest (bis er zu ist) und das was er liest an eine andere Klasse weiter gibt

Nicht ganz. Ich möchte AT-Befehle an ein Bluetoothgerät weitergeben.
Ich möchte auf den Befehl nur die Rückmeldung einlesen und ausgeben.
Also “AT” senden und es kommt ein “OK” zurück. Das OK möchte ich ausgeben und dann einen neuen AT-Befehl senden.

genau hier mal Pseudocode


Öffne Verbindung
while ((n = is.read()) != -1)
{
das was gelesen verarbeiten
wenn OK dann schicke nächsten Befehl
sonst mache irgendwas anderes
}
Programm zu ende

Danke! Ich werde versuchen es umzusetzen.

EDIT> Hoppala, hatte den letzten Beitrag nicht gesehen … aber lass das hier mal stehen <EDIT

Das “13” steht für “Carriage Return”, und markiert ein Zeilenende.

Das ist in verschiedenen Welten (Linux/Windows/Embedded…) leider immer unterschiedlich, manchmal ist es auch 10 (Line Feed) oder beides (10, 13 : Line Feed gefolge von Carriage return).

Nochmal: Es wäre gut, zu wissen, was für ein InputStream das ist, und wo er seine Daten herbekommt.

Grundsätzlich würde aber nichts dagegen sprechen, das Zeilenende explizit abzufragen. Ohne genauere Infos würde ich da jetzt GANZ übervorsichtig sowas machen wie

while (true)
{
    n = in.read();
    if (n == -1)
    {
        System.out.println("Ende");
        break;
    }
    if (n == 10)
    {
        System.out.println("Line feed - mal weitersehen...");
        n = in.read(); 
    }
    if (n == -1)
    {
        System.out.println("Ende");
        break;
    }
    if (n == 13) 
    {
        System.out.println("Carriage return - stoppe...");
        break;
    }

    System.out.println("Zuletzt gelesen: "+n);
    sb.append((char) n);
...

wenn das so ähnlich aussieht dann kann man auch einen BufferedReader nehmen weil der hat die readLine Methode
diese liest eine komplette Zeile bis
oder \r

Danke Marco13, werde gegenfalls deinen Code ausprobieren.

den BufferedReader habe ich schon probiert, allerdings möchte JavaME diesen auch nach dem Import nicht.
Laut der API (http://docs.oracle.com/javame/config/cldc/ref-impl/midp2.0/jsr118/index.html) scheint es dem im MID nicht zugeben. Schade.

Hey Marco13,

ich habe deinen Code in Betrieb genommen. Funktioniert sehr gut! Allerdings beginnen die Antworten des Bluetoothmoduls immer mit Carriage Return und Linefeed. Und hören damit auf. Häng grad daran, wie ich das entsprechend umsetze. Schätzungsweise ist bei mir heute nur noch StackOverflow!

:slight_smile: Super ich seh schon ich bin hier bei den richtigen leuten