GPSの連続データ取得について

Sun SPOT についてのご質問はこちら。情報交換などにもご利用ください。

GPSの連続データ取得について

投稿記事by 桐蔭高校科学部 » 2010年8月12日(木) 16:25

桐蔭高校の中村です。
今、GPSのGPGGAのデータをモードセレクターを使って、
SW2を押すとSunSPOT本体にGPSデータを書き込み続けるプログラムを作ろうとしていますが
SW2を押しても一つのデータしか取れません。
何が悪いのでしょうか?

配線は資料のそのままです。

GPS は秋月の GT-720F です。

以下プロジェクトの内訳です。

ModeSelection.java

コード: 全て選択
package org.sunspotworld;

import com.sun.spot.sensorboard.peripheral.LEDColor;
import com.sun.squawk.io.BufferedReader;
import java.io.InputStreamReader;

public class ModeSelection extends SunSpotApplicationAdapter {

    RMS rms;
    BufferedReader in;
    static final String DB = "GPSRecordStore";
    static final int RECORD = 0;
    static final int PRINT = 1;
    static final int DELETE = 2;
    ModeSelector modeSelector;

    protected void setup() {
        System.out.println("setup");
        modeSelector = new ModeSelector(LEDColor.GREEN, LEDColor.CYAN, LEDColor.RED);
        while (!modeSelector.selected()) {
            sleep(100);
        }

        switch (modeSelector.getMode()) {
            case RECORD:
                rms = RMS.getInstance(DB, true);
        in = new BufferedReader(new InputStreamReader(new UARTInputStream(9600)));
                break;
            case PRINT:
                rms = RMS.getInstance(DB, false);
                break;
        }
    }

    protected void loop() throws Exception {
        switch (modeSelector.getMode()) {
            case RECORD:
                for(int w = 0 ;w <= 100;w++){
                String sentence = in.readLine();
                System.out.println("??Get??");

                if (sentence.startsWith("$GPGGA")) {
                                    System.out.println("GetGet");
                    rms.writeString(sentence).
                            flush();
                                    System.out.println("Keep!");}

                    sleep(99);
                }

            case PRINT:
                if (rms.hasMoreRecords()) {
                    System.out.println(rms.readString());
                    rms.skip();
                } else {
                    exitLoop();
                }
                break;
            case DELETE:
                RMS.delete(DB);
                exitLoop();
        }
    }

    protected void cleanup() throws Exception {
        System.out.println("Cleanup");
        in.close();
    }

}



ModeSelector.java

資料そのままです。


RMS.java

コード: 全て選択

package org.sunspotworld;

/**
  *
  * @author yamaguchi
  */
import com.sun.squawk.util.ByteArrayInputStreamWithSetBytes;
import com.sun.squawk.util.ByteArrayOutputStreamWithGetBytes;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import javax.microedition.rms.RecordStoreNotOpenException;

public class RMS {
     private RecordStore rs;
     private DataInputStream in;
     private ByteArrayInputStreamWithSetBytes baIn;
     private DataOutputStream out;
     private ByteArrayOutputStreamWithGetBytes baOut;
     private int index;

     public RMS(String name, boolean createIfNecessary) {
         try {
             rs = RecordStore.openRecordStore(name, createIfNecessary);
         } catch (Exception e) {
             rs = null;
         }
     }

    public static RMS getInstance(String name, boolean createIfNecessary) {
        try {
            return new RMS(name, createIfNecessary);
        } catch (Exception e) {
            return null;
        }
    }

     public static void delete(String name) {
         try {
             RecordStore.deleteRecordStore(name);
         } catch (RecordStoreException e) {
         }
     }


    public boolean hasMoreRecords() {
        try {
            return rs.getNumRecords() > 0 && index <= rs.getNumRecords();
        } catch (RecordStoreNotOpenException e) {
            return false;
        }
    }


     void prepareInput() throws Exception {
         if (index == 0 && rs.getNumRecords() > 0)
             index = 1;
         baIn = new
ByteArrayInputStreamWithSetBytes(rs.getRecord(index));
         in = new DataInputStream(baIn);
     }

     void prepareOutput() {
         if (out == null) {
             baOut = new ByteArrayOutputStreamWithGetBytes();
             out = new DataOutputStream(baOut);
         }
     }

     public String readString() throws Exception {
         if (in == null)
             prepareInput();
         try {
             return in.readUTF();
         } catch (EOFException e) {
             if (index < rs.getNumRecords()) {
                 index ++;
                 in = null;
                 return readString();
             }
             throw e;
         }
     }

     public long readLong() throws Exception {
         if (in == null)
             prepareInput();
         try {
             return in.readLong();
         } catch (EOFException e) {
             if (index < rs.getNumRecords()) {
                 index ++;
                 in = null;
                 return readLong();
             }
             throw e;
         }
     }

     public java.lang.String readBun() throws Exception {
         if (in == null)
             prepareInput();
         try {
             return in.readUTF();
         } catch (EOFException e) {
             if (index < rs.getNumRecords()) {
                 index ++;
                 in = null;
                 return readBun();
             }
             throw e;
         }
     }


     public double readDouble() throws Exception {
         if (in == null)
             prepareInput();
         try {
             return in.readDouble();
         } catch (EOFException e) {
             if (index < rs.getNumRecords()) {
                 index ++;
                 in = null;
                 return readDouble();
             }
             throw e;
         }
     }

     public void skip() {
         if (in != null) {
             try {
                 in.close();
             } catch (IOException e) {
             } finally {
                 index ++;
                 in = null;
             }
         }
     }

     public RMS writeString(String s) throws Exception {
         if (out == null)
             prepareOutput();

         out.writeUTF(s);

         return this;
     }

     public RMS writeLong(long n) throws Exception {
         if (out == null)
             prepareOutput();

         out.writeLong(n);

         return this;
     }

     public RMS writeBun(java.lang.String a) throws Exception {
         if (out == null)
             prepareOutput();

         out.writeUTF(a);

         return this;
     }

     public RMS writeDouble(double v) throws Exception {
         if (out == null)
             prepareOutput();

         out.writeDouble(v);

         return this;
     }

     public RMS flush() throws Exception {
         byte[] data = baOut.getBytes();
         rs.addRecord(data, 0, data.length);
         try {
             out.close();
         }
         catch (IOException e) {}
         finally {
             out = null;
         }

         return this;
     }
}



UARTInputStream.java

資料そのままです。

SunSpotAplicationAdapter.java

資料そのままです。
桐蔭高校科学部
 
記事: 40
登録日時: 2010年7月23日(金) 09:06

Re: GPSの連続データ取得について

投稿記事by yamaguch » 2010年8月12日(木) 21:37

ModeSelection.java の switch と break の使い方が違っているようです。

switch 文では case XXX: に分岐した後、break 文が現れるまでが実行されます。

例えば、以下のコードで n == B のときは // do something-2 の部分だけを実行しますが、
n == A のときは // do something-1 の部分と // do something-2 の部分を実行します。

コード: 全て選択
switch (n) {
    case A:
        // do something-1
    case B:
        // do something-2
        break;
    case C:
        ...
}


山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: GPSの連続データ取得について

投稿記事by 桐蔭高校科学部 » 2010年8月13日(金) 13:29

中村です。

ありがとうございます。

しかし、まだ連続してデータは取れず、一つずつしか取れません。

どうしてでしょうか?

以下が修正した後のModeSelection.javaで、Loopを少し変えています。

コード: 全て選択
package org.sunspotworld;

import com.sun.spot.sensorboard.peripheral.LEDColor;
import com.sun.squawk.io.BufferedReader;
import java.io.InputStreamReader;

public class ModeSelection extends SunSpotApplicationAdapter {

    RMS rms;
    BufferedReader in;
    static final String DB = "GPSRecordStore";
    static final int RECORD = 0;
    static final int PRINT = 1;
    static final int DELETE = 2;
    ModeSelector modeSelector;

    protected void setup() {
        System.out.println("setup");
        modeSelector = new ModeSelector(LEDColor.GREEN, LEDColor.CYAN, LEDColor.RED);
        while (!modeSelector.selected()) {
            sleep(100);
        }

        switch (modeSelector.getMode()) {
            case RECORD:
                rms = RMS.getInstance(DB, true);
                in = new BufferedReader(new InputStreamReader(new UARTInputStream(9600)));
                break;
            case PRINT:
                rms = RMS.getInstance(DB, false);
                break;
        }
    }

    protected void loop() throws Exception {
        switch (modeSelector.getMode()) {
            case RECORD://for文を削除

                String sentence = in.readLine();
                System.out.println("??Get??");

                if (sentence.startsWith("$GPGGA")) {
                    System.out.println("GetGet");
                    rms.writeString(sentence).
                            flush();
                    System.out.println("Keep!");
                }

                sleep(990);//変更
                if (sw1.isClosed() == true) {
                    exitLoop();
                }
                break;// 追加

            case PRINT:
                if (rms.hasMoreRecords()) {
                    System.out.println(rms.readString());
                    rms.skip();
                } else {
                    exitLoop();
                }
                break;
            case DELETE:
                RMS.delete(DB);
                exitLoop();
        }
        sleep(10);
    }

    protected void cleanup() throws Exception {
        System.out.println("Cleanup");
        in.close();



また、SunSPOTとパソコンを接続したままデータを取ろうとすると、

以下のような文が表示され、データを取ることができません。

この文は何を意味しているのでしょうか?

コード: 全て選択
java.io.IOException: UART data overrun error
    at java.lang.Throwable.<init>(bci=16)
    at java.lang.Throwable.<init>(bci=5)
    at java.lang.Exception.<init>(bci=6)
    at java.io.IOException.<init>(bci=6)
    in virtual method #110 of com.sun.spot.sensorboard.EDemoController(bci=271)
    at com.sun.spot.sensorboard.EDemoController.readUART(bci=48)
    at com.sun.spot.sensorboard.EDemoBoard.readUART(bci=10)
    at org.sunspotworld.UARTInputStream.read(UARTInputStream.java:30)
    at com.sun.cldc.i18n.j2me.ISO8859_1_Reader.read(bci=8)
    at com.sun.cldc.i18n.j2me.ISO8859_1_Reader.read(bci=14)
    at java.io.InputStreamReader.read(bci=49)
    in virtual method #20 of com.sun.squawk.io.BufferedReader(bci=119)
    in virtual method #22 of com.sun.squawk.io.BufferedReader(bci=41)
    at com.sun.squawk.io.BufferedReader.readLine(bci=5)
    at org.sunspotworld.ModeSelection.loop(ModeSelection.java:39)
    at org.sunspotworld.SunSpotApplicationAdapter.startApp(SunSpotApplicationAdapter.java:51)
    in virtual method #10 of javax.microedition.midlet.MIDlet(bci=17)
    at javax.microedition.midlet.MIDletTunnelImpl.callStartApp(bci=4)
    at com.sun.squawk.imp.MIDletMainWrapper.main(bci=378)
    in virtual method #95 of com.sun.squawk.Klass(bci=32)
    at com.sun.squawk.Isolate.run(bci=414)
    at java.lang.Thread.run(bci=17)
    in virtual method #47 of com.sun.squawk.VMThread(bci=42)
    in static method #3 of com.sun.squawk.VM(bci=6)
桐蔭高校科学部
 
記事: 40
登録日時: 2010年7月23日(金) 09:06

Re: GPSの連続データ取得について

投稿記事by yamaguch » 2010年8月13日(金) 14:09

受信を開始すると GPS からはひっきりなしにデータが送られてきます。これを Sun SPOT の UART で受信しているのですが、内部の受信バッファ(受信データを一時的にためておくところ)は 32 バイトしかないため、9600 bps で受信していると 0.03 秒ほどでいっぱいになってしまいます。

コード: 全て選択
java.io.IOException: UART data overrun error
    at java.lang.Throwable.<init>(bci=16)
    at java.lang.Throwable.<init>(bci=5)
    at java.lang.Exception.<init>(bci=6)
    at java.io.IOException.<init>(bci=6)
    in virtual method #110 of com.sun.spot.sensorboard.EDemoController(bci=271)
    at com.sun.spot.sensorboard.EDemoController.readUART(bci=48)
    at com.sun.spot.sensorboard.EDemoBoard.readUART(bci=10)
    at org.sunspotworld.UARTInputStream.read(UARTInputStream.java:30)

は、このような状態になったときに発生します。受信の途中に sleep() が入っているのが原因でしょう。

山口
yamaguch
 
記事: 482
登録日時: 2010年7月06日(火) 17:37

Re: GPSの連続データ取得について

投稿記事by 桐蔭高校科学部 » 2010年8月13日(金) 15:29

中村です。

ありがとうございました :D

おかげでうまくいきました。
桐蔭高校科学部
 
記事: 40
登録日時: 2010年7月23日(金) 09:06


Return to Sun SPOT 質問箱

cron