Laufzeitfehler bei serieller Uebermittlung:

  • hallo,


    Hardware Assus Tablet MemoPad
    Android: 4.1.2


    im augenblick versuche ich Daten eines microcontroller via usb-Otg kabel
    zu lesen.
    mit hilfe von original: Android SerialMonitorLite funktioniert das auch.
    keine Probleme
    da ich nur lesen moechte, hab dann eine kleine app entwickelt.
    dass funktioniert auch.


    nun die fehler:
    - wenn ich nur den code ohne den ausdokumentierten teil laufen lasse
    ist alles ok


    - sobald der ausdokumentierte code ins spiel kommt
    - Fehler: Applikation wurde leider beendet


    da ich das im augenblick nicht debuggen kann , haengt ja am controller.
    in der entwicklung von apps bin ich ein newbie . mach das erst seit ca.4 wochen.


    im ausdokumentierten teile ist auch code-varianten die ich ausprobiert habe


    ich waere froh, wenn mir jemand helfen koennte
    ich moechte aus dem InputString: "$11:22:33:-44:" via convert ein integer tokArray machen, dann
    anschliessend die werte des array einzelnen variable zu weisen.


    um tips tricks hinweise waere ich dankbar
    gruss stephan


    als attachment: SerialReader.java



  • Du wirst im LogCat Deiner IDE eine entsprechende Error-Ausgabe finden.
    Diese sagt Dir, was genau wann wo schief gegangen ist.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • hi marco,
    danke fuer deine antwort.
    leider geht das mit LogCat und ide nicht,
    da das tablet beim testen am microcontroller haengt , also nicht mit der ide verbunden ist.
    probiere heute einige sachen aus, hoffentlich find ich den bloeden fehler
    gruss nomad

  • hallo,
    da logCat nicht benutzbar, hab ich einfach am ende von run() ein mStop=true;
    dann bleibt mal alles stehen:


    hab jetzt einige sachen gefunden:


    tokens ist ein string array:
    myString = $11:22:33:44:


    - in: tokens = myStr.split(delims);


    - tokens[0] ist leer
    - tokens[1] = 11
    - ....
    tokens[4] = -44


    das waere vermutlich der 1.fehler


    kann jetzt immerhin mit


    - gx = Integer.parseInt(tokens[1]);
    gy = Integer.parseInt(tokens[2]);
    gz = Integer.parseInt(tokens[3]);
    compass = Integer.parseInt(tokens[4]);


    meine vars zuweisen und ausdrucken.


    aber sobald kein mStop vorhanden (true) dann kommt es zu Abbruechen.
    vermutlich hat das etwas mit dem thread (Runnable - Run()) zu tun ???
    Thread.sleep zum beispiel ???


    da diese app eigentlich nur ein subprogramm eines opengl programms werden soll
    frag ich mich ob es moeglich ist die serialReader-App ganz ohne Threads zu
    entwickeln also:


    1. activity openglProg:
    - 1 -> 2. activity -> SerialReader
    -> SerialReader (open SerialPort mit Init)
    - 2 -> while loop (opengl)
    -> (serialRead)
    -> calculations
    -> drawing 3d-cubes
    - 3) on exit:
    - 1) -> SerialRead (close SerialPort)
    -> exit SerialRead
    - 2) -> exit opengl


    waere so was moeglich....


    fuer hinweise waere ich dankbar


    gruss nomad

  • Moin,


    Du hängst also direkt am Mikrocontroller. Stimmt allerdings, dann kommst Du nicht mehr an die Ausgaben.
    Einerseits könntest Du (je nach Device) Crash Logs aktivieren und nach dem Absturz übertragen.
    Ist aber nach wie vor schwierig zu debuggen.


    Besser wäre es, Du würdest für die Tests von der Hardware absehen und die Eingaben durch den Microchip simulieren.
    Für Deinen Serial Reader würde ich einen Unittest (TestNG oder JUnit) vorschlagen. Dann hättest Du den Test reproduzierbar und könntest nach jeder Änderung am Code schnell testen, ob Du irgendwas Wichtiges kaputt gemacht hast.


    Auf jeden Fall solltest Du die Eingaben zunächst simulieren.


    Für mich sieht es so aus als würdest Du irgendwo im Hintergrund mit der Hardware kommunizieren und dann an den Mainthread Dinge posten. Das halte ich für einen ungünstigen Weg, da Du Dir so Abhängigkeiten schaffst. Eventuell wäre hierfür ein Callback der bessere Lösungsansatz. Dann bekäme Deine App die notwendigen Informationen auf direktem Wege und müsste sich um die Verteilung kümmern. Dein SerialReader hat mit der Anzeige der gelesenen Daten ja eigentlich nix zu tun.


    Mal sehen, ob ich da was gezimmert bekomme, das Dir beim Debuggen helfen könnte.


    // Nachtrag
    Da scheint aber eine Menge Musik in Deiner Main Activity zu stecken. Zu viel, als dass ich das mal eben überblicken könnte.
    Hast Du eventuell irgendwo das komplette Projekt auf einem Server liegen? Idealerweise in einem Sourcecode Management System hinterlegt?

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

    Einmal editiert, zuletzt von Marco Feltmann ()

  • hi marco
    vielen dank fuer deine antwort:
    also
    die ursprung app ist "AndroidSerialMonitorLite -> google play und als project


    der grund fuer diese app:
    das tablet als HMD - system benutzen (oculus rift)
    - Stereo SideBySide mit opengl GLES 20 -> das funktioniert schon
    - HeadTracker fuer HMD -> 2 Microcontroller (compass und gyroscope) -> daher der SerialReader
    - die serielle verbindung ist eigentlich eine drahtlose XBEE verbindung
    - beim tablet benutz ich ein OTGkabel + xbee (das funzzt auch)
    - hab das ganze schon mit Linux gemacht, alles ok


    unterdessen versuch ich den reader als Service mit Messages hin zu bekommen
    also 1.main-activity start, stop, + Textview


    da funktioniert noch nicht alles.


    sobald ich an meinen windows sitze schick ich dir mal paar zip files....
    vielen dank
    gruss nomad

  • hi,
    also zu den fragen.
    meine urspruengliche frage sollte eigentlich erledigt sein.
    hab ein bisschen ueber die straenge geschlagen....
    funktioniert jetzt einigermassen


    hab das ganze jetzt Services umgestellt.
    leider ist die urspruengliche app eigentlich ein schrittezaehler :)
    aber ich nehm was ich finde...


    an fuer sich laeuft das ganze (also der serielleTeil)
    folgendes Problem(e)
    in MainActivity

    Code
    private EreignisHandler ereignisHandler = new EreignisHandler();
      
    	private class EreignisHandler extends Handler {
    		@Override
    		public void handleMessage(Message msg) {
    			textView.setText(Integer.toString(msg.what));
    			//textView.setText(msg);
    			//textView.append(msg);
    		}
    	}


    und in MyReaderService



    ich schaff es im augenblick nicht den erhaltenen String vom Controller also
    "$11:22:33:-44:"
    im service in eine string message um zuwandeln ????
    grosse verstaendnisschwierigkeiten.


    dasselbe im service.
    im web findet man schon snippets, die aber voellig ohne zusammenhang auskommen.


    ueber hinweise weise waere ich sehr froh.


    als attachments:
    - MySerialReader.zip (project) kann nicht rauf geladen werden zu gross 1.52mb :)
    - MainActivity.zip (main)
    - MyReaderService.zip (service)


    gruss nomad

  • - MySerialReader.zip (project) kann nicht rauf geladen werden zu gross 1.52mb :)


    Ist das bereits ohne die .gen/, .out/ und .build/ Verzeichnisse?


    Wenn Du nicht mit einem Debugger an das Gerät kommst und Dir keinerlei Logausgaben zwischenspeichern kannst wird das alles ausgesprochen schwierig.
    Kannst Du nicht wenigstens in den Entwickleroptionen 'Fehlerberichte im Menü "Ein/Aus"' aktivieren und Dir die Logs dann nach dem Crash beim String umwandeln zuschicken lassen?


    Irgendwie musst Du ja an die Daten kommen und ich vermute, dass deine 'Strings' ByteArrays sind, die sich nicht so einfach umwandeln lassen.
    Doch ohne klare Aussagen und harte Fakten (die nur der Debugger und die Logs liefern können) wird das schwer zu testen.


    Hast Du ganz eventuell eine API Übersicht zu dem Microcontroller, aus der idealerweise als Codebeispiel hervor geht, was genau das Ding zurückliefert?
    Mit diesen Daten könntest Du Dir für Testzwecke eine simulierte Datenquelle bauen und entsprechend mit Logs und Debugger testen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • hi,
    danke fuer deine antwort.
    also:
    - 1) die beiden attachments entsprechen dem /src-folder


    - 2) Der DatenString vom Microcontroler entspricht: "$11:22:33:-44:"
    den kann ich auch in 4 einzelne variable parsen


    - 3) Die seriellen Settings sind im MyReaderService aufgefuehrt
    - die entsprechen denen von Android USB Serial Monitor Lite-Package


    - 4) Die Sache mit dem Microcontroller ist einwenig komplex
    die basis ist ein Linux project:
    - a) es sind 2 parallax propeller 32bit controller (spin)
    - kommuninziert wird via XBee (RS232) Sender (in C)
    - Linux mit XBEE (RS-232) als Empfaenger (low-level-rs-232-funktionien)
    - fuer linux ist das eine einfache serielle verbindung
    - b) vor ca. 6 wochen bekam ich das tablet in die haende:
    - da opengl GLES 20 funktioniert (incl. Stereo SideBySide)
    - rs232 funktioniert ja auch.....
    -also hab ichs mal ausprobiert.....:)


    - b) android sieht dies auch als serielle verbindung an.
    - also hier sind keine probleme


    - 5) in der zwischenzeit hab ich ein BindDemo im web gefunden
    package: von: edu.dartmouth.cs.binddemo"
    - da liefert MyService.java (den Teststring $11:22:33:-44:) der
    - MainActivitiy.java
    - da hab ich i.A. das problem die serielle function einzubauen- .)


    ich hab nochmals dein posting durchgelesen:



    koenntest du mir bitte erklaeren wie das mit dem Callback funktioniert.
    die sache mit Services, ist auf meinen mist gewachsen....:)

    dass koennte ev.die loesung fuer meine probleme sein.
    also mein ziel:


    - mainActivity
    - (opengl mit einem button) start -> serielle kommunication
    - init, open serialStuff)


    - im RunLoop holt sich die opengl-function dann die daten
    - zeichnet die 3d-objecte



    - zwischenschritt:
    mainactivity textview mit 1 button


    vielen dank fuer deine hilfe
    nomad

  • +puh+
    Über zweieinhalb Stunden Arbeit für nix und wieder nix.
    Naja, egal.


    Projekt via Eclipse erstellt. Gegebenenfalls musst Du einmal nen Clean durchführen.
    Sollte komplett fehlerfrei sein und die einzige Warnung im Layout kommt auch nur, weil ich einen Button fest verlabelt habe.
    (a.k.a. "Ist nur zum Test, brauch ich später nicht" -> "Och, ist ein nettes Feature, lass ich doch drin.")


    Ich hoffe, Du findest die Dokumentation einleuchtend und das Beispiel hilfreich.
    Bei dem Seriellgespiele kann ich Dir allerdings nicht weiterhelfen. :-/


    (Ich bin ein Fuchs, wa? Die generierten Zeichenketten sehen aus als kämen sie direkt vom Controller. Das heißt, Du kannst diesen Service als Dummycontroller für Testzwecke nutzen und meinetwegen auch noch um andere Dinge erweitern.)

  • hi,
    vielen dank fuer deine arbeit und muehe.
    hab dein ServiceDemoProject runtergeladen und versucht zu testen:
    - Import ok
    - dein project -> auf android 4.4
    - habs dann auf 4.1.2 umgestellt.
    - manifest
    - compile:
    - 1) save all
    - 2) refresh
    - 3) clean
    - 4) buildProject
    soweit so gut
    - Run: your project contains errors -> fix
    - da ich leider keinerlei errors entdecken kann.....

    aber trotzdem vielen dank, ich kann ja teile daraus benutzen....


    hab unterdessen ev. die loesung meiner probleme gefunden:
    im web: usb-serial-for-android -
    - Android USB host serial driver library for CDC, FTDI,
    - Arduino and other devices. - Google Project Hosting.htm
    http://code.google.com/p/usb-serial-for-android/
    oder:
    https://github.com/mik3y/usb-serial-for-android

    da gibts ein uraltes project (2011)
    vorgehen: usbSerialExample.zip runterladen, nur das project ohne die
    vorgeschlagenen jar files:
    - compile
    - device_list.xml ergaenzen
    ( orignal app starten mit otg + microcontroller)
    - neue vendor eintraege)
    - das project um libs erweitern
    - von einer anderen serialApp android-support-v4.jar einfuegen
    - da die Baud-rate im quellcode verdrahtet ist, muss man dort die gewuenschte baud-rate eintragen
    - bei mir 9600 , original 115200
    - recompile
    - run:
    - es erscheinen 2 buttons:
    - den button benutzen, welcher FTDI-Driver anzeigt
    - 2. screen:
    - run with received Bytes: + der Teststring vom Microcontroller...
    - bin damit recht zufrieden
    - simple, einwenig oldStyle :)) aber ok


    also ich wuerde meinen, dass dieser thread erledigt ist...
    nochmals vielen dank fuer deine muehe, geduld und arbeit


    als attachment die beiden geaenderten java-files (jar geht leider nicht)



    gruss nomad

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!