質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

mbedでGPSモジュールを使用して現在位置をteratermに表示したいです。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,037

job_nk

score 6

 前提・実現したいこと

mbed(nucleo-f303k8)でGPSモジュール(GYSFDMAXB)を使用して現在位置(緯度経度の値)をteratermに表示したいです。
mbedのコンパイラでGPSモジュール(GYSFDMAXB)のライブラリをインポートし、メイン関数に現在位置をteratermに表示させるようなプログラムを書いたのですが、以下のようなエラーが発生しました。

 発生している問題・エラーメッセージ

Error: No default constructor exists for class "GPS" in "main.cpp", Line: 5, Col: 6

 該当のソースコード

以下のソースコードは上から順に、【main.cpp】【GPS.h】【GPS.cpp】というファイル名です。

#include "mbed.h"
#include "GPS.h"

Serial pc(USBTX, USBRX); // tx, rx
GPS gps;

float a,b;

int main() {
    a=gps.longtitude;
    b=gps.latitude;

    while (1) {
        pc.printf("longtitude=%f",a);       //緯度
        pc.printf("latitude=%f",b);          //軽度
    }      
}
#ifndef GPS_H
#define GPS_H




//GPS Library for GYSFDMAXB
/*
秋月電子にて販売されているGYSFDMAXB(GPS受信機1pps出力付きみちびき対応)用ライブラリです
Uartの受信割り込みを用いて、センテンスを受信し始めると自動的に処理を行い、緯度経度を計算します。

※注意 割り込み設定を行わないと正常に動作しません。mbedの場合は全ての割りこみが同じ優先順位なので優先順位の衝突が生じます
STMマイコンの場合は、
NVIC_SetPriority(USART3_IRQn,2);
などとmain内に追加します。usart3とは、Serial3_TXとSerial3_RXを使っているためです。Serial1_TX,RXを使用するなら、usart1と入れてください
'2'は、優先順位のことです。mbedではデフォルトで全て2に設定されています(stmマイコンの場合)。0が一番優先順位が高く、1,2,3の順に低くなります。




*/

#define GPSTX p28//GPSのTXピン
#define GPSRX p27//GPSのRXピン
#define GPSBAUD 115200//GPSのボーレート
#define ODR 10//max 10Hz 更新周期

class GPS {
public:
    GPS(PinName gpstx,PinName gpsrx);

    void gpscmd(char *command);
    void getgps();

    float longtitude;//緯度
    float latitude;//経度
    //上の二つは自動的に更新される この二つを読むことでデータ取得が出来る

    bool result;//trueで成功、falseで失敗
    char buf[100];

private:  
    Serial _gps;
};

#endif
#include "mbed.h"
#include "GPS.h"

GPS::GPS(PinName gpstx,PinName gpsrx): _gps(gpstx,gpsrx)
{
    latitude=0;
    longtitude=0;

    gpscmd("314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");
    int odr=ODR;
    odr=1000/odr;
    sprintf(buf,"300,%d,0,0,0,0",odr);
    gpscmd(buf);

    int baud=GPSBAUD;

    for(int i=0;i<100;i++){
        buf[i]=0;
    }

    sprintf(buf,"251,%d",baud);

    gpscmd(buf);
    gpscmd(buf);


    _gps.baud(GPSBAUD);

    _gps.attach(this,&GPS::getgps);
}

void GPS::gpscmd(char *command)
{
    int len=strlen(command);
    char xordata[len+4];
    sprintf(xordata,"PMTK%s",command);


    char  xorbuf=0x00;
    for(int i=0;i<len+4;i++){
        xorbuf=xorbuf^xordata[i];
        }


    char packet[len+8];
    if(xorbuf>0x0f){
        sprintf(packet,"$%s*%x",xordata,xorbuf);
        }
    else {
        sprintf(packet,"$%s*0%x",xordata,xorbuf);
        }


    _gps.printf(packet);
    _gps.putc(0x0D);
    _gps.putc(0x0A);
}

void GPS::getgps()
{
    if(_gps.getc()=='$'){

    int counter;
    char sample=0x00;

    int point1=0;
    int point2=0;


        for(counter=0;counter<18;counter++){
         sample=_gps.getc();   
        }

        if(sample=='A'){

        //初期化
        latitude=0;
        longtitude=0;

            //データ取得
            for(counter=0;sample!='\n';counter++){
              sample=_gps.getc();
              buf[counter]=sample;

                if(buf[counter]=='.'&&point1==0){
                  point1=counter;
                }

                if(counter>8&&buf[counter]=='.'&&point2==0){
                    point2=counter;
                }
            }

            //緯度計算
            for(counter=1;counter<point1-2;counter++){

                    float num=1;
                    for(int i=point1-counter-3;i>0;i--){
                        num=num*10;
                    }

                    latitude+=(float)num*(buf[counter]-48);
                }

            float minute=0;

            minute+=(buf[point1-2]-48)*10;
            minute+=(buf[point1-1]-48);

                for(counter=point1+1;counter<point1+5;counter++){
                    float num=1;

                    for(int i=counter-point1;i>0;i--){
                        num=num*0.1f;
                    }

                    minute+=(float)num*(buf[counter]-48);
                }

            latitude+=minute/60;


            //経度計算
            for(counter=point1+8;counter<point2-2;counter++){

                    float num=1;
                    for(int i=point2-counter-3;i>0;i--){
                        num=num*10;
                    }

                    longtitude+=(float)num*(buf[counter]-48);
                }

            minute=0;

            minute+=(buf[point2-2]-48)*10;
            minute+=(buf[point2-1]-48);

                for(counter=point2+1;counter<point2+5;counter++){
                    float num=1;

                    for(int i=counter-point2;i>0;i--){
                        num=num*0.1f;
                    }

                    minute+=(float)num*(buf[counter]-48);
                }

            longtitude+=minute/60;


                result=true;
            }

            else{
                result=false;
            }





    }
}

 試したこと

【GPS.h】と【GPS.cpp】のソースコードは一切変更せず、【main.cpp】のソースコードだけ新たに私が作成しました。【GPS.h】のpublicfloat longtitude;float latitude;を読み取ればデータが読み取れるそうなので、それを読み取るソースコードを【main.cpp】に書きました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

GPSを宣言した時に、GPS gpsと宣言していますが、gpsクラスの初期化をしていない気がします。

手元に試せる環境がないので憶測にはなってしまいますが、

GPS gps = new GPS(GPSTX, GPSRX);


と記述してみてはどうでしょうか。
また、グローバル宣言ではなくmain()関数内で定義したほうがよろしいかと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/07 22:47

    mbedの開発環境で正しいボードを選んでいるなら、適切なヘッダを自動的にインクルードしてくれるようなので、mbed.hのままで大丈夫だと思われます。mbedのボード製品ページにピン名が書かれていますので、実際GPSユニットと接続しているピンに合わせてGPS.hのdefineを書き換え、コンストラクタの呼び出し方がちょっと違うので修正すればとりあえずコンパイルは通ると思います。あとはがんばってください。

    キャンセル

  • 2018/09/07 22:59

    hope_mucciさん、補足情報ありがとうございます。

    キャンセル

  • 2018/09/19 00:54

    いろいろ試してみたのですが、結局よくわからずコンパイルできませんでした。
    別の方法でやってみようと思います。
    コメントをしていただいた方々、ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る