[RXTX] GPS-Maus (Comport) effizient auslesen

tobi193

Aktives Mitglied
Hallo,

ich habe mir so eine nette kleine GPS-Maus gekauft, die mit dem mitgelieferten Treiber über einen virtuellen Com-Port ausgelesen werden kann. Das klappt auch soweit ganz gut mit folgendem Quelltext:
Java:
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.TooManyListenersException;

public class GPS implements SerialPortEventListener{

	private CommPortIdentifier serialPortId;
	private Enumeration enumComm;
	private SerialPort serialPort;

        private final int baudrate = 4800;
        private final String portName = "COM7";
        private BufferedReader br;

	public GPS(){

            if(openSerialPort()){
                try{
                    serialPort.addEventListener(this);
                    serialPort.notifyOnDataAvailable(true);
                }catch(TooManyListenersException ex){}
            }
	}

        public static void main(String[] args){
            new GPS();
        }

	public boolean openSerialPort(){
            boolean foundPort = false;
            enumComm = CommPortIdentifier.getPortIdentifiers();
            while(enumComm.hasMoreElements()) {
                    serialPortId = (CommPortIdentifier) enumComm.nextElement();
                    if(portName.contentEquals(serialPortId.getName())) {
                            foundPort = true;
                            break;
                    }
            }
            if(!foundPort)
                    return false;

            try{

                serialPort = (SerialPort) serialPortId.open(this.getClass().getName(),2000);
                serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                br = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
            }catch(Exception e){
                return false;
            }
            return true;
	}

        public void serialEvent(SerialPortEvent event){
            switch (event.getEventType()){
            case SerialPortEvent.BI:
            case SerialPortEvent.OE:
            case SerialPortEvent.FE:
            case SerialPortEvent.PE:
            case SerialPortEvent.CD:
            case SerialPortEvent.CTS:
            case SerialPortEvent.DSR:
            case SerialPortEvent.RI:
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY: break;
            case SerialPortEvent.DATA_AVAILABLE:
                try{
                    System.out.println(br.readLine());
                }catch(IOException ex){}
                break;
            }
        }
}

Das dumme ist, in der Konstellation werden recht immense 50% Systemlast beansprucht. Das auf einem flotten DualCore.
Ich habe auch die folgende Methode ausprobiert:

Java:
String line;
while((line = br.readLine()) != null){
  System.out.println(line);
}

Mit oder ohne kurzem schlafenlagen, es kommt aufs gleiche hinaus. Ledeglich lange Wartezeiten schaffen Abhilfe, dann wird aber der Empfang verzerrt bzw. setzt in bestimmten Intervallen aus, das ist also keine gute Lösung.

Wie kann ich also das ganze effizient auslesen ?

Gruß tobi
 

tobi193

Aktives Mitglied
Ich habe nun noch weiter herumprobiert und zunächst Wartezeiten eingebaut. Das führte dann aber nach längerem ausführen zu einem Stau und damit GPS Positionen aus der Vergangenheit.
Daher warte ich einfach alle 10 Sekunden nur 25ms. Damit hat man einen Kompromiss der so aussieht:
Java:
        public void run(){
            try{
                log.println("<gpx version=\"1.1\" creator=\"My Software\">");
                log.println("<rte>");
                String s = "";
                while(true){
                    int c = inputStream.read();
                    if(c != 10){
                        s += (char) c;
                    }else{
                        if(s.startsWith("$GPGGA")){
                            try{
                                String[] split = s.split(",");
                                GeoPosition gp = new GeoPosition(convertLat(split[2], split[3]), convertLon(split[4], split[5]));
                                for(GPSListener gl : listener){
                                    gl.neuePosition(gp);
                                }
                                log.println("<rtept lat=\"" + gp.getLatitude() + "\" lon=\"" + gp.getLongitude() + "\"></rtept>");
                                time++;
                                if(time < 10){
                                   Thread.sleep(1000);
                                }else{
                                    Thread.sleep(25);
                                    time = 0;
                                }
                            }catch(Exception e){}
                        }
                        s = "";
                    }
                }
            }catch(Exception e){
                System.err.println("GPS auslesen Fehler: " + e.getMessage());
            }
        }

Dummerweise habe ich beim Test gerade eben draußen feststellen müssen, dass hin und wieder einige Punkte an der selben Stelle liegen, obwohl ich gelaufen bin. Daher gab es Unterbrechungen und einen "Messpunktehaufen" von bis zu rund 50 Stück.
Liegt das einfach am Empfang oder kann das irgendwie auch mit dem Auslesen zu tun haben ?

Gruß
 

HoaX

Top Contributor
Lass doch mal den Eventhandler weg und nutze nur dein BufferedReader#readline. Das DataAvailable braucht dich da ja nicht interessieren.
notifyOnDataAvailable dann natürlich auch false.
 
Zuletzt bearbeitet:

Mathias.K

Mitglied
Hallo ich bin noch absoluter JAVA Anfänger und würde ebenfalls gern eine GPS Maus auslsen ,

ich habe mir den Quelltext kopiert und eingefügt (eclipse oberfläche)

Wenn ich das Programm starten möchte bekomme ich immer die Fehlermeldung , dass ich die rxtx API nicht richtig eingefügt habe , zumindest deute ich das daraus ;D

java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
Exception in thread "main" java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:83)
at GPS.openSerialPort(GPS.java:40)
at GPS.<init>(GPS.java:26)
at GPS.main(GPS.java:35)

Was mache ich falsch ? Ich habe über > Properties > Build Path die RXTXcomm.jar zu meinem Projekt hizugefügt aber es funktioniert nicht . ???:L
 

Andi_CH

Top Contributor
Hm so nach dem da ist rxtxserial eine dll die gesucht und nicht gefunden wird.

und ohne jetzt genau jeden Link zu lesen hier dürftest du herausfinden wie du die dll einbinden musst.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M RXTX Details auslesen Allgemeine Java-Themen 6
F rxtx library mit virtuellem Comport Allgemeine Java-Themen 2
T Outputstream write() gets blocked using RXTX to communicate with HC-05 BT Module Allgemeine Java-Themen 10
H RXTX String verarbeiten Allgemeine Java-Themen 1
S RxTx - langsame Port suche Allgemeine Java-Themen 3
L Software-Design: Kommunikation mit SerialPort (RXTX) Allgemeine Java-Themen 2
R Virtuelle Serielle Schnittstellen mit RXTX Allgemeine Java-Themen 2
G RXTX native library unter Linux in jar build angeben Allgemeine Java-Themen 4
M rxtx OutputStream sendet falsche werte Allgemeine Java-Themen 3
M problem mit rxtx Allgemeine Java-Themen 9
G RXTX in proprietärer Software nutzen?! Allgemeine Java-Themen 10
S RXTX library in Jar einbinden Allgemeine Java-Themen 5
T RXTX und 64bit Allgemeine Java-Themen 1
R RXTX Versions Info abschalten Allgemeine Java-Themen 6
T Frage zu Schönheitsfehler bei RXTX Allgemeine Java-Themen 2
C RXTX Treiber einbinden für Linux Allgemeine Java-Themen 6
G RXTX library braucht sehr lange zum laden. Ist das normal? Allgemeine Java-Themen 8
B RXTX sendet immer mit 9600Baud Allgemeine Java-Themen 4
E Erfahrung mit RXTX sowie Windows und Linux Allgemeine Java-Themen 9
G RXTX verschicken einzelener Bytes Allgemeine Java-Themen 8
E javax.comm: Suche eine open source Alternative zu rxtx Allgemeine Java-Themen 8
O RXTX Geschwindigkeit? Codebeispiel dabei. Allgemeine Java-Themen 21
B RXTX und close Allgemeine Java-Themen 12
L Exception auslösen, um while Schlaufe zu verlassen(rxtx.org) Allgemeine Java-Themen 6
M Geschwindigkeit RXTX JAVA Allgemeine Java-Themen 3
foobar Rxtx vs javax.comm Allgemeine Java-Themen 2
Lauezl Projektil zur Maus Position Allgemeine Java-Themen 10
Tobero JFrame nimmt keinen Key oder Maus inputs Allgemeine Java-Themen 0
M Java – Warum kann ich plötzlich bei Android Studio Grafische Benutzeroberflächen mit der Maus gestalten? Allgemeine Java-Themen 5
V Maus mitthilfe Bewegungssensor steuern (Java) Allgemeine Java-Themen 12
I AWT MouseListener Extra Knopf auf der Maus Allgemeine Java-Themen 9
N Globale Maus Allgemeine Java-Themen 7
SeppiHinteregger Maus realistisch simulieren Allgemeine Java-Themen 5
S JFreechart: ValueMarker mit der Maus ziehen? Allgemeine Java-Themen 12
K Screenshot mit Maus Allgemeine Java-Themen 2
Z zeit zwischen maus drücken und loslassen Allgemeine Java-Themen 7
S GPS-Maus über USB ansprechen Allgemeine Java-Themen 8
C Markierung durch Maus lesen Allgemeine Java-Themen 9
M Maus durch JavaProgramm bewegen Allgemeine Java-Themen 2
G Eingabegerät unterscheiden (z.B. Maus oder Touchpad) Allgemeine Java-Themen 3
S GPS-Maus auslesen Allgemeine Java-Themen 14
M Automatische Steuerung der Maus Allgemeine Java-Themen 6
G TJable MULTIPLE_INTERVAL_SELECTION ohne Maus Allgemeine Java-Themen 2
B Maus-Cursor zurücksetzen Allgemeine Java-Themen 4
S virtuelles Comport mit Java? Allgemeine Java-Themen 2
M schon wieder Comport-Problem Allgemeine Java-Themen 21

Ähnliche Java Themen

Neue Themen


Oben