teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

GPSの情報の取得に問題があるとわかったので追記しました。

2020/04/11 18:00

投稿

photan
photan

スコア5

title CHANGED
File without changes
body CHANGED
@@ -199,6 +199,74 @@
199
199
 
200
200
  ただ、最終的には余計なデータ送信をしたくないのでこれらのデバッグ用のシリアル送信は削除したいと思っています。Serial.printlnの有無で挙動が変わるというのも不可解です。
201
201
 
202
+ ####追記
203
+ プログラムが止まるタイミングからgetGPS()関数が怪しいと思いコメントアウトしてみたところ、デバッグ用のシリアル通信を削除した上でバイナリデータの送信が成功しました。getGPS()関数は以下になります。
204
+ ```
205
+ void getGPS() {
206
+ String line;
207
+ String s;
208
+ double LAT; //緯度
209
+ double LNG; //経度
210
+ double GS; //対地速度
211
+
212
+ GPSSerial.listen();
213
+ while (!GPSSerial.isListening());
214
+ //1つのセンテンスを読み込む
215
+ do {
216
+ String line = GPSSerial.readStringUntil('\n');
217
+ if (line != "") {
218
+ int i, index = 0, len = line.length();
219
+ String str = "";
220
+
221
+ //Stringlist生成
222
+ String list[30];
223
+ for (i = 0; i < 30; i++) {
224
+ list[i] = "";
225
+ }
226
+
227
+ //「,」を区切り文字として文字列を配列にする
228
+ for (i = 0; i < len; i++) {
229
+ if (line[i] == ',') {
230
+ list[index++] = str;
231
+ str = "";
232
+ continue;
233
+ }
234
+ str += line[i];
235
+ }
236
+
237
+ //$GPRMCセンテンスを読み込んで、緯度、経度、対地速を表示する
238
+ if (list[0] == "$GPRMC") { //素子に応じて$以下の部分を変える
239
+ if (list[2] == "A") { //GPSが測位不可でない時
240
+ //緯度
241
+ LAT = NMEA2DD(list[3].toFloat()), 6;
242
+ //経度
243
+ LNG = NMEA2DD(list[5].toFloat()), 6;
244
+ //対地速(km/h)
245
+ GS = list[7].toFloat() * 1.852; //1ノット=1.852km/h
246
+ }
247
+ s += String(LAT, 6);
248
+ s += String(LNG, 6);
249
+ s += (String)GS;
250
+ data[7] = LAT;
251
+ data[8] = LNG;
252
+ data[9] = GS;
253
+ }
254
+ }
255
+ } while (s == ""); //ちゃんと読めるまで
256
+ }
257
+
258
+ //NMEAの緯度経度を「度」(DD)の表記に変換
259
+ float NMEA2DD(float val) {
260
+ float u;
261
+ int d = val / 100;
262
+ int m = (((val / 100.0) - d) * 100.0) / 60;
263
+ float s = (((((val / 100.0) - d) * 100.0) - m) * 60) / (60 * 60);
264
+ u = d + m + s;
265
+ return u;
266
+ }
267
+ ```
268
+ 秋月電子通商で販売されているGPSモジュールを使用しています。通信にはソフトウェアシリアルを使用しています。
269
+
202
270
  ### 補足情報(FW/ツールのバージョンなど)
203
271
 
204
272
  dataAquisition()関数内のget○○の関数すべてが正常に動作することは確認されています。また、バイナリデータへ変換するRecordbuf()も正常に動作することが確認できています。