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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Tera Term

Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

Q&A

1回答

1698閲覧

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

job_nk

総合スコア6

Tera Term

Tera Termは、TeraTerm Projectが開発する国産のWindows向けターミナルソフト。telnetプロトコルでのリモートホストへの接続やCOMポートのシリアル接続が可能で、マクロが利用できます。

GPS

GPSは、Global Positioning Systemの略です。衛星信号を使用して受信機の地上又は空中内の居場所を特定するナビゲーションシステムです。"GPS"は受信機のことも指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

mbed

mbed(エンベッド)は、Webサイト上でC++を使って開発を行う、ワンボードマイコンのプロトタイピングツールです。PCに開発環境をインストールする必要がなく、Webにアクセスできればどこにいても開発を行うことができます。

0グッド

0クリップ

投稿2018/09/06 02:48

前提・実現したいこと

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】というファイル名です。

c++

1#include "mbed.h" 2#include "GPS.h" 3 4Serial pc(USBTX, USBRX); // tx, rx 5GPS gps; 6 7float a,b; 8 9int main() { 10 a=gps.longtitude; 11 b=gps.latitude; 12 13 while (1) { 14 pc.printf("longtitude=%f",a); //緯度 15 pc.printf("latitude=%f",b); //軽度 16 } 17} 18

c++

1#ifndef GPS_H 2#define GPS_H 3 4 5 6 7//GPS Library for GYSFDMAXB 8/* 9秋月電子にて販売されているGYSFDMAXB(GPS受信機1pps出力付きみちびき対応)用ライブラリです 10Uartの受信割り込みを用いて、センテンスを受信し始めると自動的に処理を行い、緯度経度を計算します。 11 12※注意 割り込み設定を行わないと正常に動作しません。mbedの場合は全ての割りこみが同じ優先順位なので優先順位の衝突が生じます 13STMマイコンの場合は、 14NVIC_SetPriority(USART3_IRQn,2); 15などとmain内に追加します。usart3とは、Serial3_TXとSerial3_RXを使っているためです。Serial1_TX,RXを使用するなら、usart1と入れてください 16'2'は、優先順位のことです。mbedではデフォルトで全て2に設定されています(stmマイコンの場合)。0が一番優先順位が高く、1,2,3の順に低くなります。 17 18 19 20 21*/ 22 23#define GPSTX p28//GPSのTXピン 24#define GPSRX p27//GPSのRXピン 25#define GPSBAUD 115200//GPSのボーレート 26#define ODR 10//max 10Hz 更新周期 27 28class GPS { 29public: 30 GPS(PinName gpstx,PinName gpsrx); 31 32 void gpscmd(char *command); 33 void getgps(); 34 35 float longtitude;//緯度 36 float latitude;//経度 37 //上の二つは自動的に更新される この二つを読むことでデータ取得が出来る 38 39 bool result;//trueで成功、falseで失敗 40 char buf[100]; 41 42private: 43 Serial _gps; 44}; 45 46#endif

c++

1#include "mbed.h" 2#include "GPS.h" 3 4GPS::GPS(PinName gpstx,PinName gpsrx): _gps(gpstx,gpsrx) 5{ 6 latitude=0; 7 longtitude=0; 8 9 gpscmd("314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0"); 10 int odr=ODR; 11 odr=1000/odr; 12 sprintf(buf,"300,%d,0,0,0,0",odr); 13 gpscmd(buf); 14 15 int baud=GPSBAUD; 16 17 for(int i=0;i<100;i++){ 18 buf[i]=0; 19 } 20 21 sprintf(buf,"251,%d",baud); 22 23 gpscmd(buf); 24 gpscmd(buf); 25 26 27 _gps.baud(GPSBAUD); 28 29 _gps.attach(this,&GPS::getgps); 30} 31 32void GPS::gpscmd(char *command) 33{ 34 int len=strlen(command); 35 char xordata[len+4]; 36 sprintf(xordata,"PMTK%s",command); 37 38 39 char xorbuf=0x00; 40 for(int i=0;i<len+4;i++){ 41 xorbuf=xorbuf^xordata[i]; 42 } 43 44 45 char packet[len+8]; 46 if(xorbuf>0x0f){ 47 sprintf(packet,"$%s*%x",xordata,xorbuf); 48 } 49 else { 50 sprintf(packet,"$%s*0%x",xordata,xorbuf); 51 } 52 53 54 _gps.printf(packet); 55 _gps.putc(0x0D); 56 _gps.putc(0x0A); 57} 58 59void GPS::getgps() 60{ 61 if(_gps.getc()=='$'){ 62 63 int counter; 64 char sample=0x00; 65 66 int point1=0; 67 int point2=0; 68 69 70 for(counter=0;counter<18;counter++){ 71 sample=_gps.getc(); 72 } 73 74 if(sample=='A'){ 75 76 //初期化 77 latitude=0; 78 longtitude=0; 79 80 //データ取得 81 for(counter=0;sample!='\n';counter++){ 82 sample=_gps.getc(); 83 buf[counter]=sample; 84 85 if(buf[counter]=='.'&&point1==0){ 86 point1=counter; 87 } 88 89 if(counter>8&&buf[counter]=='.'&&point2==0){ 90 point2=counter; 91 } 92 } 93 94 //緯度計算 95 for(counter=1;counter<point1-2;counter++){ 96 97 float num=1; 98 for(int i=point1-counter-3;i>0;i--){ 99 num=num*10; 100 } 101 102 latitude+=(float)num*(buf[counter]-48); 103 } 104 105 float minute=0; 106 107 minute+=(buf[point1-2]-48)*10; 108 minute+=(buf[point1-1]-48); 109 110 for(counter=point1+1;counter<point1+5;counter++){ 111 float num=1; 112 113 for(int i=counter-point1;i>0;i--){ 114 num=num*0.1f; 115 } 116 117 minute+=(float)num*(buf[counter]-48); 118 } 119 120 latitude+=minute/60; 121 122 123 //経度計算 124 for(counter=point1+8;counter<point2-2;counter++){ 125 126 float num=1; 127 for(int i=point2-counter-3;i>0;i--){ 128 num=num*10; 129 } 130 131 longtitude+=(float)num*(buf[counter]-48); 132 } 133 134 minute=0; 135 136 minute+=(buf[point2-2]-48)*10; 137 minute+=(buf[point2-1]-48); 138 139 for(counter=point2+1;counter<point2+5;counter++){ 140 float num=1; 141 142 for(int i=counter-point2;i>0;i--){ 143 num=num*0.1f; 144 } 145 146 minute+=(float)num*(buf[counter]-48); 147 } 148 149 longtitude+=minute/60; 150 151 152 result=true; 153 } 154 155 else{ 156 result=false; 157 } 158 159 160 161 162 163 } 164}

試したこと

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

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

GPS gps = new GPS(GPSTX, GPSRX);

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

投稿2018/09/06 02:55

編集2018/09/06 02:58
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

job_nk

2018/09/06 03:38

回答ありがとうございます。 以上のようにやってみましたが、以下のようなエラーが出ました。 Error: Identifier "p28" is undefined in "main.cpp", Line: 10, Col: 24 どのようにすればいいでしょうか?
退会済みユーザー

退会済みユーザー

2018/09/06 05:29

修正後のコードありましたら、記載していただけるとサポートしやすいです。 Line:10←つまり、10行目になにかあるよってことなので・・・ よろしくお願いします。
job_nk

2018/09/06 06:14

以下は【main.cpp】のソースコードです。 #include "mbed.h" #include "GPS.h" Serial pc(USBTX, USBRX); // tx, rx float a,b; int main() { GPS gps = new GPS(GPSTX, GPSRX); a=gps.longtitude; b=gps.latitude; while (1) { pc.printf("longtitude=%f",a); //緯度 pc.printf("latitude=%f",b); //軽度 } } 10行目は"GPS gps = new GPS(GPSTX, GPSRX);"です。 よろしくお願いします。
hope_mucci

2018/09/06 23:11

必要なヘッダは全てインクルードされていますか? 足りないヘッダがあると思われます。 p28で全文検索したらわかるんじゃないでしょうか。 (エラーメッセージの意味をちゃんと理解しましょう。平素な英語ですよ)
退会済みユーザー

退会済みユーザー

2018/09/07 05:09

まさかと思って調べたらSTM32のマイコンですね・・・mbed.hでは動かないのでは・・・? このCPUに適合したヘッダファイルがあるかと思います。 GPSモジュールのコードもみてきましたが、注意書き等を読みながら、構築する必要がありそうです。 (ソースコードに書いてありました) なお、GPSモジュールもデバイスに合わせていろいろ変更する必要がありそうです。
hope_mucci

2018/09/07 13:47

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

退会済みユーザー

2018/09/07 13:59

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

2018/09/18 15:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問