JAVA – GPS RECEPTOR在控制台中发送奇怪/编码的帧

我有一个GPS接收器,它给我发送了NMEA帧。 我的代码检索这些代码,但forms非常奇怪:

在此处输入图像描述

我正在使用PuTTY来查看我的受体接收到的NMEA帧,并且没有问题。

在此处输入图像描述

编辑 – 这是我正在使用的代码:

public class GPSFrame extends Observable implements Runnable { static Thread myThread=null; static BufferedReader br; static BufferedWriter wr; static PrintWriter out; static InputStreamReader isr; static OutputStreamWriter osw; static java.io.RandomAccessFile port; /** CONSTRUCTOR **/ public GPSFrame() { myThread=new Thread(this); } public void start() { try { port=new java.io.RandomAccessFile("COM5","rwd"); port.writeBytes("\r\n"); port.writeBytes("c,31,0,0,5\r\n"); port.writeBytes("T,1000,1\r\n"); } catch (Exception e){ System.out.println("start "+e.toString()); } // The thread start automatically run() method myThread.start(); } /********************************************************************************************** *************************** RETRIEVE GPS FRAMES AND SEND TO SERVEUR ************************** **********************************************************************************************/ public void run() { System.out.println("lecture COM..."); // INFINIT LOOP - GPSFrame is always listening for the GPS receptor for(;;) { String st = null; try { st=port.readLine(); String[]gpsframe=st.split(","); /* IMPORTANT - DON'T FORGET SETCHANGED() or GPSFrame'll never * notify UPDATE() ServerBoard method - We'll never see any changes */ setChanged(); notifyObservers(st); } catch (IOException e){ System.out.println(e.getMessage()); } // Show in console System.out.println(st); } } } 

编辑:

当我第一次用 PuTTY 读取GPS帧 然后启动我的应用程序时,我可以在控制台中看到正确的GPS帧。 但是当我尝试首先使用我的应用程序读取GPS帧时,我已经对帧进行了编码。

我不知道为什么我不能以这种forms检索帧。 有人可以指导我解决这个问题吗?

提前谢谢你!

问候,

Tofuw

正如我在评论中所说,你没有正确地从COM端口读取。 我找到了一个可以帮助你弄清楚如何从com端口读取的库。 代码很旧,但我认为它仍然有用: http : //javanmea.sourceforge.net/

检查这些类: NMEAReader和CustomReader 。

还有一个类似的c ++线程可能会有所帮助。 从COM PORT C ++接收NMEA0183数据

如果您找到解决方案,请发布。 看到它会很有趣:)

我找到了解决问题的方法! :d

我的代码有点问题,因为我使用RandomAccessFile来读取我的COM端口。 通过这种方法,我可以读取受体发出的帧,但不能正确。 解决了它,我必须CONFIGURE the COM PORT ,这是RandomAccessFile无法实现的

我做了配置测试:

  • 使用DATABITS_5或DATABITS_6,我收到了这样的框架:

    $% ():2“)1” 2

  • 但是使用DATABITS_7或DATABITS_8,我收到了很好的框架:

    $ GPRMC,100409.000,A,4858.018,N,00150.999,E,0.0,0.0,201213,0.0,W * 70 $ GPGGA,100409.000,4858.01754,N,00150.99913,E,1,15,0.7,034.93,M,47.2中,M ,, * 66

我认为默认情况下,Databits或配置为5或6.这取决于。 这就是为什么最好配置自己的端口。

配置COM端口的方式(或其中一种方法是)使用SerialPort

这是一个非常有用的解决方案 (在本例中我们使用事件模式读取数据,但您可以使用流模式 – 请参阅下面的第二个链接)

 public class GPScom implements SerialPortEventListener { private String portcom; private CommPortIdentifier portid=null; private SerialPort serialport; private BufferedReader fluxgps; // Reading flow port where the GPS is connected public static void main(String[]args) { // Driver initialization Win32Driver driver=new Win32Driver(); driver.initialize(); GPScom gpscom=new GPScom(); gpscom.listPort(); } // Scanning all available ports public void listPort() { Enumeration listport=CommPortIdentifier.getPortIdentifiers(); int typeport; String GPSPortCOM; while(listport.hasMoreElements()) { portid=(CommPortIdentifier)(CommPortIdentifier)listport.nextElement(); if(portid.getPortType()==CommPortIdentifier.PORT_SERIAL) { System.out.println("Port Name : "+portid.getName()); System.out.println("User : "+portid.getCurrentOwner()); System.out.println("Use ? : "+portid.isCurrentlyOwned()); System.out.println("Port type : "+portid.getPortType()); this.ModeEvenement(portid.getName()); } } } // Initialization of the port public void ModeEvenement(String portcom) { // Retrieve ID Port try{portid=CommPortIdentifier.getPortIdentifier(portcom);} catch(NoSuchPortException e){System.out.println(e);} // Open Port try{serialport=(SerialPort)portid.open("ModeEvenement",2000);} catch(PortInUseException e){System.out.println(e);} // Retrieve data flow try{fluxgps=new BufferedReader(new InputStreamReader(serialport.getInputStream()));} catch(IOException e){System.out.println(e);} // Add listener try{serialport.addEventListener(this);} catch(TooManyListenersException e){System.out.println(e);} // Configure Port serialport.notifyOnDataAvailable(true); try{serialport.setSerialPortParams(4800, SerialPort.DATABITS_6, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);} catch(UnsupportedCommOperationException e){System.out.println(e);} System.out.println("Port is open, waiting for the reading"); } // Here we are reading 7 frames for test public void ReadSerialPort() { int i=7; String reponse=new String(); try { System.out.println("i="+i); while(i!=0) { System.out.println("Reading the COM port \n"); reponse=(String)fluxgps.readLine(); System.out.println(reponse); i--; System.out.println("i="+i); } } catch(IOException e){System.out.println(e);} // On ferme le flux de lecture try{fluxgps.close();} catch(IOException e){System.out.println(e);} serialport.close(); } public void serialEvent(SerialPortEvent event) { // We are only reading data if available switch(event.getEventType()) { case SerialPortEvent.DATA_AVAILABLE: this.ReadSerialPort(); // Launching the reading if data are available break; default: break; // Else, do nothing } } } 

这是我找到这个解决方案的地方(/!\ French sites:D):

  • 读取COM端口
  • 如何使用javax.comm串口

如果您遇到与我相同的问题,我希望它会对您有所帮助

祝你今天愉快 !!!

Tofuw

PS:感谢Aphex和AlexWien帮助过我