Konsolenausgabe fehlerhaft

Status
Nicht offen für weitere Antworten.
X

xpate

Gast
Guten Morgen

Ich habe da ein kleines Problem und hoffe Ihr könnt mir dabei helfen das zu lösen.

Ich habe einen GPS Empfänger via serieller Schnittstelle an meinem Laptop angeschlossen und die Daten, die der GPS Empfänger sendet frage ich ab und möchte einige der Zeichen ausgeben.
Der GPS Empfänger nutzt das NMEA Protokoll und ich frage nur die GPGGA Rahmen ab. Den Rest ignoriere ich vor erst.

Das funktioniert auch größtenteils. Nur leider ist die Ausgabe nicht so, wie ich sie mir vorstelle. Die ersten Zeichen in der Ausgabe werden noch richtig dargestellt, der Rest leider nur als Viereck. Wenn ich mir einen Breakpoint setze und das Programm langsam durchlaufen lasse, werden zwar mehr Zeichen dargestellt, aber auch nicht alle.

Ist das nun ein Fehler im Code oder ein Fehler von Eclipse?

Hier der Programmcode:

Code:
import java.io.*;
import java.util.*;
import gnu.io.*; 

public class GPSAblauf implements Runnable, SerialPortEventListener {
   static CommPortIdentifier portId;
   static CommPortIdentifier saveportId;
   static Enumeration        portList;
   InputStream           inputStream;
   SerialPort           serialPort;
   Thread           readThread;

   static String        messageString = "Test";
   static OutputStream      outputStream;
   static boolean        outputBufferEmptyFlag = false;

   public static void main(String[] args) {
      boolean           portFound = false;
      String           defaultPort;
      
      defaultPort = "COM1";
      /*String osname = System.getProperty("os.name","").toLowerCase();
      if ( osname.startsWith("windows") ) {
         // windows
         defaultPort = "COM1";
      } else if (osname.startsWith("linux")) {
         // linux
        defaultPort = "/dev/ttyS0";
      } else {
         System.out.println("Dein Betriebssystem wird nicht unterstützt");
         return;
      }*/
          
      if (args.length > 0) {
         defaultPort = args[0];
      } 

      System.out.println("Standard Port: "+defaultPort);
      
     portList = CommPortIdentifier.getPortIdentifiers();
      while (portList.hasMoreElements()) {
         portId = (CommPortIdentifier) portList.nextElement();
         if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
            if (portId.getName().equals(defaultPort)) {
               System.out.println("Gefundener Port: "+defaultPort);
               portFound = true;
               GPSAblauf reader = new GPSAblauf();
            } 
         } 
         
      } 
      if (!portFound) {
         System.out.println("Serielle Schnittstelle: " + defaultPort + " nicht gefunden.");
      } 
      
   } 

   public void initwritetoport() {
      try {
         outputStream = serialPort.getOutputStream();
      } catch (IOException e) {}

      try {
         serialPort.notifyOnOutputEmpty(true);
      } catch (Exception e) {
         System.out.println("Fehler");
         System.out.println(e.toString());
         System.exit(-1);
      }
      
   }
/* 
   public void writetoport() {
      System.out.println("Writing \""+messageString+"\" to "+serialPort.getName());
      try {
         outputStream.write(messageString.getBytes());
      } catch (IOException e) {}
   }
*/

   public GPSAblauf() {
      try {
         serialPort = (SerialPort) portId.open("SimpleReadApp", 4800);
      } catch (PortInUseException e) {}
   
      try {
         inputStream = serialPort.getInputStream();
      } catch (IOException e) {}
   
      try {
         serialPort.addEventListener(this);
      } catch (TooManyListenersException e) {}
      
      serialPort.notifyOnDataAvailable(true);
   
      try {

         serialPort.setSerialPortParams(4800, SerialPort.DATABITS_8, 
                     SerialPort.STOPBITS_1, 
                     SerialPort.PARITY_NONE);
      } catch (UnsupportedCommOperationException e) {}
      
      readThread = new Thread(this);
      readThread.start();
      
   }

   public void run() {
      initwritetoport();
      
      try {
         while (true) {
            //writetoport();
            Thread.sleep(1000);
         }
      } catch (InterruptedException e) {}
  
    	  System.out.println("Keine Verbindung vorhanden");
      
   } 

   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 {   
    	    byte[] readBuffer = new byte[71];
    	    
            while (inputStream.available() > 0) {
            	int input = inputStream.read(readBuffer);
            	if (input == -1)
            		break;
            //System.out.println("Read " + input + "characters");
            int nn = input;
            for (int i=0; i<Math.min(readBuffer.length, input); i++)
            {
            	if (readBuffer[i] == 0)
            	{
            		nn = i;
            		break;
            	}
            }
            byte[] toprint = new byte[nn];
            for (int i=0; i<nn; i++)
            	toprint[i] = readBuffer[i];
            
            }
            String result = new String(readBuffer);
            
            boolean test = result.startsWith("$GPGGA");
            boolean test1 = result.startsWith("\n$GPGGA");
            
    		
    		char[] rahmen = new char[5];
    		result.getChars(1, 1 + 5, rahmen, 0);
    		String result1 = new String(rahmen);
    		
    		char[] uhr = new char[2];
    		result.getChars(7, 7 + 2, uhr, 0);
    		String result2 = new String(uhr);
    		
    		char[] uhr2 = new char[2];
    		result.getChars(9, 9 + 2, uhr2, 0);
    		String result3 = new String(uhr2);
    		
    		char[] uhr3 = new char[2];
    		result.getChars(11, 11 + 2, uhr3, 0);
    		String result4 = new String(uhr3);
    		
    		char[] breitengrad = new char[8];
    		result.getChars(14, 14 + 2, breitengrad, 0);
    		String result5 = new String(breitengrad);    		

    		if (test) {		
            		System.out.println(result);
            		System.out.println("Rahmen: " + result1 + ", Uhrzeit: " + result2 + ":" + result3 + ":" + result4 + ", Breitengrad: " + result5);
            }
       		else if (test1) {
       				System.out.println(result);
       				System.out.println("Rahmen: " + result1 + ", Uhrzeit: " + result2 + ":" + result3 + ":" + result4 + ", Breitengrad: " + result5);
       		}
       		else 
       			System.out.println(result.length());
            
    		
    		
         } catch (IOException e) {} 
         
         break;
      }
   } 
   
}
Ist alles nur Quick n Dirty ;) Soll nur grob die Funktion testen das Programm. Wird später komplett anders ablaufen.

Danke und Gruß Jan

Edit: Habe leider vergessen den Screenshot zu posten.
Hier ist er:
 

Marco13

Top Contributor
Hm. Das sind (ganz allgemein) "nicht-darstellbare Zeichen". Es sagt ja erstmal keiner, dass die Daten da als Strings geliefert werden. Es kann ja sein, dass die ersten 3 bytes eben sowas wie "GPS" sind, aber die nächsten 4 bytes bezeichnen vielleicht EINEN int (oder float).... Kanns ja mal (nachdem du alle "lesbaren" Zeichen glesen hast) sowas machen wie
ObjectInputStream ois = new ObjectInputStream(inputStream);
float f = ois.readFloat();
oder
int i = ois.readInt();

Wenn die Zahlen, die da Rauskommen, dann die erwarteten Längengrade usw. sind, weißt du, woran's liegt...
 
G

Gast

Gast
Hi
Danke schon einmal für deine Hilfe.
Sitz gerade wieder am Arbeitsplatz und habe daher deinen Vorschlag noch nicht testen können.

So sieht eine komplette Zeile aus, die ich vom GPS Empfänger bekomme: "$GPGGA,191410,4735.5634,N,00739.3538,E,1,04,4.4,351.5,M,48.0,M,,*45"

Die Daten werden über die RS232 Schnittstelle als reine ASCII Zeichen gesendet.
Komischerweise zeigt er mir ja zumindest die ersten zwei Zeichen vom Breitengrad an, wenn ich mit Breakpoints das Programm durchgehe. Nehme ich den allerdings weg und es läuft automatisch durch, dann bekomm ich sofort dort wieder meine Vierecke ;)

Gruß Jan
 

thE_29

Top Contributor
Normalerweise ist das ein Fehler der IDE´s!

Probiere das ganze mal im dos oder in der shell aus.
 
T

tuxedo

Gast
Hatte selbiges Problem in meiner Studienarbeit. War ein "dummer" Fehler. Weiß nur gerade nicht mehr woran es genau lag. An der IDE lags jedenfalls nicht.

- Alex
 

thE_29

Top Contributor
Doch!
Zb wenn du System.out.print((char)8); sagst!
Das ist ein Backspace!
Die meisten IDE´s machen dir dann ein [] (Kästchen wie oben hin) und gehen nicht mal zurück.

Man muss/kann entweder das Konsolenverhalten der IDE ändern oder man testet es nachher in der shell.
 
T

tuxedo

Gast
Es geht hier aber um darstellbare ASCII Zeichen wie sie jeder NMEA taugliche GPS-Empfänger zurückgiebt.....Dass da zwischendrin was "nicht darstellbares" rauskommt ist nicht normal.

@Threadstarter: Geb mir mal deine Emailadresse. Dann schick ich dir ein Codebeispiel aus meiner Studienarbeit. Das sollte eigentlich funktionieren (getestet mit einem Bluetooth-GPS Empfänger und einem USB-GPS Empfänger...)

- Alex
 
G

Gast

Gast
Hi
Danke nochmals für eure Hilfe!

Direkt in der Command Shell von Windows bekomme ich das Programm nicht zum laufen, aber das ist ein anderer Fehler, bei dem ich definitiv weiß, es ist meiner ;)

Hier meine E-Mail Adresse: info@jans-fotogalerien.de

Danke und Gruß
Jan
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben