Beiträge von Arno Nym

    Hallo Leute,

    ich habe mal wieder ein Problem bei dem ich nicht weiter komme :helpnew:
    Ich benutze Netbeans und Java 8. Als Testlib pi4j.

    Wenn ich ein einfaches Programm programmiere und per Remote Debugging auf dem PI laufen lasse, geht das super. Wenn ich aber eine Lib einbinde, z.b. pi4j, dann kommen haufenweise Fehlermeldungen. Die verweisen direkt auf die Codeteile, die mit der Lib arbeiten.
    Wenn ich es aber direkt auf dem PI laufen lasse, geht das Programm. Jetzt vermute ich mal, dass ich irgendwo beim den Debug-Einstellungen noch die Lib und den Pfad einstellen muss. Ich finde aber nirgends ne Einstellung dazu. Könnt ihr mir weiter helfen?


    Danke,
    Arno

    Hallo Tell,

    ich weiß das es nicht sehr aussagefähig ist. Habe ich nur mal schnell zusammengeworfen um die Funktion zu testen ;)

    Das mit dem Threadsicher ist ein guter Hinweis. Da werde ich mich och einmal schlau machen. Ist JavaFX threadsicher?
    Muss auch mal sehen wie ich das Projekt jetzt aufziehe. Die Oberfläche soll eigentlich nur die Daten anzeigen. Da gibt es maximal paar Buttons um was zu laden.

    Thx,
    Arno

    Hallo dreamshader,

    ja, ich komm auch aus der C Ecke (Mikroprozessoren Marke Atmega und Xmega) aber ich wollte mich beim PI mal in ne neue Programmiersprache einarbeiten.
    Zumal Java halt auch dynamisch geht. Ich weiß, geht bei C++ auch :)

    dbv:
    Naja, ist denke ich ne Gewöhnungsache. Ich habs am Anfang mit Phyton probiert und habe das nicht gerafft. Mir fehlt ja schon bei vbs in Excel das ich dahinter keine ";" setzen darf :)

    Zu meiner Frage: Ich sach mal so

    FuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuckFuck!

    Ich sitze seit 3Tage(mit Unterbrechungen) an diesem Fehler und dann isses so ein Assiefehler. Kotz :wallbash::wallbash::wallbash::wallbash::wallbash::wallbash::wallbash:

    Jetzt geht es!! :bravo2: :thumbs1: Danke für deinen Tip :danke_ATDE:

    Grüße,
    Arno

    Hallo Leute,

    ich habe mal wieder ne Frage bei der ich icht richtig weiter komme. Ich möchte gern auf dem PI eine grafische Oberfläche mit Swing oder JavaFX basteln. Einfache Sachen funktionieren schon damit ganz gut. Aber man mus alles per "Klick" starten. Ich will ein extra thread der im Hintergrund paar Sachen automatisch ausführt.

    Aktueller Stand: Ich habe ein Button mit dem ich eine LED ein und wieder ausschalten kann. Als nächstes wollte ich Daten von der RS232 einlesen und in einem Textfeld anzeigen. Dafür habe ich versucht einen extra Thread zu starten(diese Class läuft in einem anderen Projekt seit Wochen super). Aber egal was ich versuche, der thread läuft genau einmal und stoppt dann.

    Was ich probiert habe:

    Das ist einfach das JavaFX Beispiel, wo man nach einem Klick einfach "Hello World!" bekommt. Ich habe einfach, dort wo die Grafik gestartet wird, den Start der neuen Threads mit eingebaut

    Es wird genau einmal ausgeführt, dann stehts. Die Oberfläche läuft problemlos.

    Also nächstes habe ich die Zeile einfach auf nen Button gelegt. Also wenn ich den Drücke soll der Thread los laufen. Aber ds gleiche, läuft einmal und stoppt dann.

    Hier mal die TestClass die ich starten will:


    Habt ihr ne Idee wo mein Fehler liegt oder ne kleine Anleitung wo ich dazu was nachlesen kann? Habe bereits im Netzt gesucht, aber dazu nichts gefunden. Oder ich suche einfach falsch. KA.

    Danke,
    Arno

    Zitat

    warum benutzt du Java ME und nicht Java SE ?

    Ich nutze zur Zeit für mein Temperaturlogger Java SE (denke ich jedenfalls) und die pi4j Lib um auf die Hardware vom Pi zu zugreifen. Da nutze ich I2C Bus, RS232 und so weiter. Geht alles supi. Aber das Debuggen in Eclypse ist nicht so schön. Habe ein paar Mal probiert mir mal den Inhalt von nem Array oder von einem Schleifenparameter an zu zeigen. Aber ging oft nicht. Auf dem PC gings nicht, weil die pi4j Lib nur auf dem ARM läuft.

    Ich habe halt gelesen und in dem Java Kurs wurde es auch gezeigt, dass das Debugging recht einfach und schick geht und man auch ohne pi4j, mit der Hardware reden kann. Das will ich mal ausprobieren. Läuft ja, wenn ich das richtig verstanden habe, auf dem PC und hat die Finger aber im PI drin. Daher ist das Debugging recht nice. Dafür benötigt man aber halt ME.

    Außerdem bin ich nch dabei die Sprache Java kennen zu lernen und die Möglichkeiten von Emebedded Systems auskunden. Kann man viel damit machen :D Aktuelles Motto ist: Try and Error :D

    Grüße,
    Arno

    Hallo Tell,

    bei dem Kurs habe ich im Mai "mitgemacht". Nach zwei Monaten warten das es los geht.
    Das Problemchen bei mir war, ich habe mich da angemeldet. Ich konnte mich einloggen und dann war da so ne unübersichtliche hässliche Seite. Ich war ganz froh als ich ne Wiki gefunden habe, wo ich wenigsten die Programme laden konnte. Aber damit was anzufangen fehlten die Infos. Gab es da irgendwo ein Link zu diesen Videos? Wenn ja bin ich zu doof:wallbash:

    Danke dir. Da werde ich den Kurs jetzt mal komplett machen. Habe ja jetzt alles was ich benötige. Ds Zertifikat bekomm ich dann leider nicht mehr, aber immerhin das wissen.

    Thx,
    Arno

    Hallo Leute,

    ich habe jetzt etwas "Erfahrung" mit der Programmierung in Java mit pi4j und Eclypse.
    Weil ich mit dem Debugging in Eclypse nicht so zufrieden bin, wollte ich mal schauen was es sonst noch so gibt und habe bei ner Suche etwas über JavaME und Netbeans gefunden und wollte das mal ausprobieren. Da wird direkt in Java auf die Schnittstellen zugegriffen ohne pi4j.
    Hier ist die Oracle Seite dazu: Oracle Embedded 8.0

    Aber ich hänge bereits bei den Grundeinstellungen. In der jwc_properties.ini soll unter dem Punkt odt_run... von true auf false gesetzt werden. Doch leider gibt es den Punkt nicht in der ini. Bei Java ME3.3 gab es den Punkt noch. Kann es sein, dass es den unter Java ME8.1 nicht mehr gibt?

    Dann habe ich gestern ein kleines Testprogramm gestartet:

    Den Punkt import jdk.dio.UnavailablePeripheralException; bringt mir der Compiller ein Fehler, weil es diesen Punkt unter den dio nicht gibt. Aber wenn ich das weg lassen kann ich es starten. Dabei ist dann 3 mal Java weggeklatscht und beim 4ten mal ging das Programm dann. Aber es blinkte halt nichts. Habe das Multimeter am richtigen Pin gehabt :wallbash: Das wegklatschen hängt bestimmt mit der Exception zusammen die ich ja gelöscht habe, weil es die nicht gibt :D

    Ich glaube das pi4j wikrlich einfacher ist. Wieso ist das bei Oracle so kompliziert :s Aktuell isses für mich also keine Alternative, abr ich denke das ich einfach noch zu wenig wissen darüber gesammelt habe. Sind ja nicht nur in der Software Einstellungen zu tätigen. Selbst in Netbeans muss man unter Application Descriptor noch Sachen einstellen.

    Benutzt das jemand von euch schon erfolgreich? Gibt es Vorteile gegenüber pi4j? Ich könnte mir halt vorstellen, dass pi4j auf dem neuen B+ halt nur die "alten" Pins kann, oder? Habe es aber noch nicht getestet! :angel:

    Oder habt ihr mal ein einfaches lauffähiges Programm für mich wo einfach ein Port getoogelt wirdoder man ein Taster drücken kann und der zeigt da was an.

    Danke
    Arno

    Hallo Lyinch,

    sehr interessantes Thema. Leider kann ich dazu nichts beitragen, weil ich mich damit nicht auskenne. Aber eine Frage habe ich dazu gleich mal.

    Du hast bei deinen Bildern bestimmte Bereiche verändert. Also das Vorfahrtsschild grüne "bemalt". Wie hast du das hinbekommen?
    Ich Suche nach einer Möglichkeit Daten vom PI per OVerlay in ein Bild oder Video einzufügen, dass man das im Livebild gleich mit sehen kann. Also z.B. Uhrzeit, Position und so.

    Wie hst du das hinbekommen?

    Danke dir,
    Arno

    Hallo Leute,

    Zitat


    Und noch was: die Verarbeitung in der getSerialData-Methode zu machen, ist weniger gut - vor allem, wenn die Verarbeitung etwas Zeit in Anspruch nimmt.

    Ja, so kenn ich es auch von den Mikroprozessoren und SPSen. Im Interrupt (Event) Case wird nur ein Flag gesetzt oder ein überschaubarer Teil Programm ausgeführt. Ebend wegen der Ausführungszeit.

    Bin gerade dabei mich mit Threads und syncronisierung zu beschäfftigen. Habe da ein Befehl "Lock" gefunden. Damit geht es scheinbar bei einfachen Programmen mit dem syncronisieren.

    Mit dem Timer auf verdacht geht so bei mir. Ich weiß wann ich Daten sende. Damit geht das. Aber wie ist das wenn ich im Thread.sleep bin und es kommt ein Event. Wacht der dann auf oder verpasse ich das das Ereigniss?


    Zitat


    In einem Java-Forum würde das nicht durchgehen


    Bin für jeden Hinweis dankbar :bravo2:.
    Bin gerade beim einarbeiten in Java und die ganze Sache mit Multithreading, syncronisieren und so ist mir zur Zeit noch nicht ganz geheuer :D. Aber es kommt langsam Licht ins Dunkel :thumbs1:

    Werde mein Lösung mal posten wenn ich es mal fertig habe :D

    :danke_ATDE:
    Arno

    Hallo Leute,

    habe jetzt eine Version zusammen gebastelt, die erstmal funktioniert :D
    Danke auch an die PN die ich mit einem Beispielprogramm bekommen habe. Das und viel lesen in Büchern hats am Ende doch gebracht :D

    Ich weiß jetzt nicht ob das hier die beste Lösung ist, aber ich stell den trotzdem mal rein. Vielleicht haben auch noch andere Leute ein Problem damit :)
    Für Verbesserungsvorschläge bin ich natürlich dankbar :D

    Mein "Machwerk": }


    und hier der TimerTask:

    Auf alle Fälle kann ich jetzt, aktuell zum testen, aller 250ms einen String per RS232 empfangen und auf der Konsole anzeigen.

    :danke_ATDE::bravo2::thumbs1::D
    Arno

    Hallo Leute,

    nachdem ihr bei meinem letzten Problemchen schon so gut geholfen habt, hier mal mein aktuelles Problemchen.

    Ich möchte gern Daten vom µC per RS232 in den Pi einlesen. Dafür benutzt ich die "pi4j" Lib. Das Beispiel was dabei ist funktioniert auch super. Daten senden und empfangen geht damit problemlos. Aber ich möchte die Daten ja nicht per Konsole ausgeben, sondern im Programm weiter verarbeiten.

    Also habe ich das Beispiel einfach etwas angepasst.
    Original sah es so aus:

    Dann habe ich für die Konsole eine globale Variable eingefügt

    Code
    public String readData;

    und den entpsrechenden Code in der Schleife:

    Code
    readData = (event.getData() + System.getProperty("line.separator"));


    ersetzt.

    Das funktioniert scheinbar irgendwie, nur leider wird kein Event mehr ausgelöst der in die Variable was reinschreibt. Es wird also nur "null" zurück gegeben. Ausserdem wird kein Datum mehr gesendet. Also wird die komplette Funktion der Seriellen Schnittstelle irgendwie blockiert.

    Nach etwas Suchen bin ich im Forum von pi4j auf ein Beitrag gestoßen, wo jemand das selbe Problem hat. Beitrag im pi4j Forum
    Dort wurde empfohlen, als "quick and dirty" Methode, der Klasse einfach eine public Variable anzufügen. Was ich ja bereits gemacht habe. Da wird auch darauf hingewisen, dass im Fall von lange laufenden Schleifen, es zu Empfangsprobleme auf der Schnittstelle kommen kann. Ich habe allerdings nur eine Schleife die sekündlich durchläuft und das serial.readData einfach nur aufruft.

    Edit: Oder liegt das daran, dass ich den Sekundentakt mittels Thread.sleep(1000); erzeuge? Weil das heißt ja, dass er einfach mal 1000ms nichts tun soll. Mist, ich glaube den Fehler habe ich gerade selber gefunden :s.

    Als super Lösung wird darauf hingewisen, dass man einen eigen Thread für den Empfang bauen soll und den dann syncronisieren muss. Und hier bin ich total überfragt, weil ich das noch nie gemacht habe. Ich habe mal ein Thread Beispiel gebastelt wo zwei Threads einfach Variablen hoch zählen. Aber das mit dem Syncronisieren raff ich irgendwie noch nicht.

    Aber mal als Frage, hat jemand ein Beispiel, wie man das Problem lösen kann und würde das mal posten. Dann habsch mal ein funktionierendes Beispiel wie es geht :)

    Danke,
    Arno

    Ok, dann mal hier der Rest vom PRogramm. Wie bereits geschrieben. Bin noch icht so weit gekommen. ISt mir halt gleich aufgefallen, dass der Ram so voll wird.


    Main_Loop:


    Filehandling:


    System_Info:

    Mehr isses leider noch nicht. Deswegen isses ja so "nervig" das ich mit dem bissel Code schon solche "Probleme" habe :)

    Vielleicht findet ihr ja nochwas. Wie schon geschrieben, bin noch Anfänger. Also wenn ihr verbesserungsverschläge habt, immer her damit :)

    :danke_ATDE:
    Arno

    Hallo rpi444,

    wow, danke für dein Beitrag. Jetzt sind wieder über 230Mb mehr Ram frei. :bravo2:


    Aber jetzt ist die Frage, habe ich was falsch Programmiert, oder muss ich einfach einmal am Tag mittels Cron Job diesen Befehl ausführen? Also Fehler bei mir oder "Fehler" im Linux. Ich gehe davon aus, dass andere das auch haben würden, also Fehler bei mir, oder? :blush:

    Weil laut "ps au" ist das Programm immer noch gleich groß im Speicher vertreten. So konstant ist das schon seit fast 2 Tagen.

    Code
    root      2530  0.0  0.3   4824  1460 tty1     S+   Jan14   0:00 sudo java -clas
    root      2531  1.8  3.1 233408 14276 tty1     Sl+  Jan14  73:44 java -classpath

    Und in den paar Minuten die ich das hier getippt habe, ist der Speicher bereits wieder gesunken :s

    Code
    pi@raspberrypi ~ $ free -m
                 total       used       free     shared    buffers     cached
    Mem:           437         44        393          0          2         11
    -/+ buffers/cache:         30        407
    Swap:           99          0         99

    Also ist irgendwo noch was nicht ganz in Ordnung, nehme ich jedenfalls mal an.:huh:

    :danke_ATDE:für den super Tip
    Arno

    Hallo Leute,

    ich habe hier schon viel gelesen, aber zu meinem Problem noch keine Lösung gefunden.

    Kurz zu mir:
    Meine Java Kenntnisse sind noch recht einfach. Kenne mich aber ganz pasabel mit C# (für ab und zu mal Hobbyprogrammieren) und C (für Mikroprozessor) aus. Linux ist für mich auch neu. Bisher nur DOS und Windows.
    Auf dem PI läuft Rasbian (aktuelles NOOBS Image 1.3.4). Da ist Java 1.7.0_40 enthalten.

    Mein Projekt: (noch nicht alles drin!)
    Ich habe einen PI mit 512MB Ram. Dort lese ich per RS232 einen Datenstring aus, den ich von einem µC bekommen. Da sind Temperaturen, Feuchtigkeit, Druck und so weiter drin. Ist so ne Art Wetterstation. Empfangen werden zwei Strings mit jeweils ca. 250 Zeichen. Dafür nutze ich pi4j. Die Daten sollen auf der SD Card oder nem externen USB Stick gespeichert werden. Ich will aller 10-30s einen Datenstring speichern. Eventuell auch auf einem Web Server anzeigen. Das ist aber erstmal nur "nice to have".
    Geschrieben wird das ganze in Eclipse Indigo und compillliert auf dem PI.Erstellt habe ich ein Standard Java Projekt wo ich pi4j als Libs eingebunden habe.

    Mein Problem:
    Ich habe ein Programm geschrieben wo ich aktuell die akt. Datum, akt. Uhrzeit, Mem Used, Mem Free, SD Card used und SD Card free speichere. Das läuft im Sekundentakt. Das Programm läuft auch recht gut,
    ABER!:

    wenn ich das Java Programm starte hat es laut "ps au" bereits 233156 VSZ (ist doch virtueller Ram, oder? und RSS von 12068 (habe ich noch nicht herrausgefunden was das ist). Das VSZ bleibt die ganze Zeit gleich. RSS erhöht sich langsam. Nach 2h ist es dann 13876. Bleibt dann aber relativ gleich. Das große Problem ist eher, dass der Ram halt mehr ausgelastet wird. Also beim Start habe ich z.B. 100Mb Ram ausgelastet. 10Mb nimmt er sofort und dann nach 2h sind es schon 115Mb. Nach drei Tagen sind es 270Mb. Länger habe ich es noch nicht laufen lassen. Ich bin auf dem PI nur mittels Putty drauf und PI läuft nur auf Konsole. Also ohne startx.

    Es wird aber auch nie Ram freigemacht. Als würde der GC nicht laufen. Wenn ich das Programm anhalte, gibt er ungefähr 10Mb Ram frei. Der Rest bleibt in Nutzung. Bei ps au verschwindet der Prozess aber komplett. Wenn ich es dan wieder neu starte geht das gleich spiel wieder los. Er nimmt 10Mb sofort und den Rest dann Stück für Stück.
    Wenn ich das Programm am PC laufen lasse, startet er laut Task Manager bei z.B. 12Mb, läuft dann bis ca. 13,8Mb voll und verringert sich auch ca. 1Mb und dann wieder bis 13,8Mb. So geht das den ganzen Tag. Auf dem PI geht es nur nach oben.

    Mache ich irgendwo ein Fehler oder habe ich etwas übersehen.


    Als Vorlage für meine Routinen nutze ich die Programmschnipsel hier: http://www.mkyong.com/tutorials/java-io-tutorials/ Die Erfassung der Zeit habe ich aus nem Java Buch. Ich gehe mal davon aus, das das daran nicht liegen kann.

    Aber hier mal der Schnipsel:

    Code
    // actual Date of the PI
        public String aktDate() {
            
            String DateText = new SimpleDateFormat("dd.MM.YYYY").format(new Date());
            
            return DateText;
        }


    Er erzeugt damit zwar immer ne neue SimpleDateFormat, aber wen er das neu erzeugt, kann das alte ja vom GC weggelöscht werden, oder? Man soll ja den GC nicht einfach in nem Loop aufrufen. Das macht der doch selber, oder?

    So erzeuge ich die Messdatei:


    Ich habe auch mal das Programm in Java mittels *** -Xmx15m gestartet. Hat auch keine Änderung gebracht. Habe auch mal Java 8 probiert. Da isses das selbe. Also muss es ja an mir liegen.

    Habt ihr evetuell ne Idee warum der immer mehr Ram frisst?

    Danke euch.
    Arno