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

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

新規登録して質問してみよう
ただいま回答率
85.48%
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

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

Q&A

解決済

2回答

1713閲覧

ESP8266 C++ コード勉強中

raspypy

総合スコア247

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

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

0グッド

0クリップ

投稿2021/06/17 06:15

編集2021/06/17 07:24

##試していること
ESP8266を使用しています.
シリアル通信を使用して,GPSのでーたを送信するプログラムを考えています.
今,↓のコードを参考にして,このコードの中身を理解しようとしていますが,

###わからないこと1
12行目~14行目の部分は,何をしているのでしょうか?
プログラムの他の部分との兼ね合いがまったくみえてこず,分かりません.
ネットで検索すると,ESP-WROOM-02でアナログ入力をするために必要とあるのですが,
このプログラムにおいてアナログ入力(Analog read)している部分がないので,必要ないと考えていますが,
必要あるのでしょうか?

###わからないこと2
152行目の
buf = (i == 0) ? shortbuf : obuf;
ここが,何をしているのかまったく理解できません.

125行目~129行目でGPSのデータを12桁の文字列"obuf"に格納していますが,
131行目~135行目でGPSのデータを8桁の文字列"shortbuf"に格納しています,

なぜ,GPSのデータを桁数が異なる2つの文字列に格納しているのかが分かりません.
そして,152行目が何をしているのかも分かりません.

教えていただけると助かります.

##プログラムコード

C++

1/* 2 * ESP8266+LoRaモジュール+GPSモジュールで、 3 * スイッチを押されたら緯度経度を取得し、 4 * bw, sfを変えながらLoRaで送信し、 5 * LoRaモジュールからのレスポンスをプリントする 6 */ 7#include <ESP8266WiFi.h> 8#include <SoftwareSerial.h> 9#include <TinyGPS++.h> 10#include <string.h> 11 12extern "C" { 13#include "user_interface.h" 14} 15 16static const int LED = 2; 17static const int gps_RX = 4, gps_TX = 5; 18SoftwareSerial gps_ss(gps_RX, gps_TX, false, 256); 19TinyGPSPlus gps; 20 21static const int sw = 16; 22static const unsigned long PUSH_SHORT = 1000; 23 24static const int LoRa_RX = 13, LoRa_TX = 12; 25static const int LoRa_Rst = 14; 26SoftwareSerial LoRa_ss(LoRa_RX, LoRa_TX, false, 256); 27 28void LoRa_reset(void) { 29 digitalWrite(LoRa_Rst, LOW); 30 delay(100); 31 digitalWrite(LoRa_Rst, HIGH); 32} 33 34int LoRa_recv(char *buf) { 35 char *start = buf; 36 37 while (true) { 38 delay(0); 39 while (LoRa_ss.available() > 0) { 40 *buf++ = LoRa_ss.read(); 41 if (*(buf-2) == '\r' && *(buf-1) == '\n') { 42 *buf = '\0'; 43 return (buf - start); 44 } 45 } 46 } 47} 48 49int LoRa_send(char * msg) { 50 char *start = msg; 51 while (*msg != '\0') { 52 LoRa_ss.write(*msg++); 53 } 54 return (msg - start); 55} 56 57#define NMODE 24 58 59struct mode { 60 int bw; 61 int sf; 62 int timeout; 63}; 64struct mode Mode[NMODE] = { 65 {3, 12, 5}, {3, 11, 5}, {3, 10, 4}, {3, 9, 3}, {3, 8, 2}, {3, 7, 2}, 66 {4, 12, 5}, {4, 11, 4}, {4, 10, 3}, {4, 9, 3}, {4, 8, 2}, {4, 7, 2}, 67 {5, 12, 4}, {5, 11, 3}, {5, 10, 2}, {5, 9, 2}, {5, 8, 2}, {5, 7, 2}, 68 {6, 12, 3}, {6, 11, 3}, {6, 10, 2}, {6, 9, 2}, {6, 8, 2}, {6, 7, 2}, 69}; 70 71int sendcmd(char *cmd) { 72 unsigned long t; 73 char buf[64]; 74 75// Serial.print(cmd); 76 LoRa_send(cmd); 77 78 while (true) { 79 LoRa_recv(buf); 80 if (strstr(buf, "OK")) { 81// Serial.print(buf); 82 return true; 83 } else if (strstr(buf, "NG")) { 84// Serial.print(buf); 85 return false; 86 } 87 } 88} 89 90void setMode(int bw, int sf) { 91 char buf[64]; 92 93 LoRa_send("config\r\n"); 94 delay(200); 95 LoRa_reset(); 96 delay(1500); 97 98 while (true) { 99 LoRa_recv(buf); 100 if (strstr(buf, "Mode")) { 101 Serial.print(buf); 102 break; 103 } 104 } 105 106 sendcmd("2\r\n"); 107 sprintf(buf, "bw %d\r\n", bw); 108 sendcmd(buf); 109 sprintf(buf, "sf %d\r\n", sf); 110 sendcmd(buf); 111 sendcmd("q 2\r\n"); 112 sendcmd("w\r\n"); 113 114 LoRa_reset(); 115 Serial.println("LoRa module set to new mode"); 116 delay(1000); 117} 118 119void send2LoRa() { 120 char obuf[64], ibuf[64], shortbuf[32]; 121 char * buf; 122 int n; 123 unsigned long t; 124 125 strcpy(obuf, "loc=("); 126 dtostrf(gps.location.lat(), 12, 8, &obuf[strlen(obuf)]); 127 strcat(obuf, ","); 128 dtostrf(gps.location.lng(), 12, 8, &obuf[strlen(obuf)]); 129 strcat(obuf, ")\r\n"); 130 131 strcpy(shortbuf, "loc=("); 132 dtostrf(gps.location.lat(), 8, 4, &shortbuf[strlen(shortbuf)]); 133 strcat(shortbuf, ","); 134 dtostrf(gps.location.lng(), 8, 4, &shortbuf[strlen(shortbuf)]); 135 strcat(shortbuf, ")\r\n"); 136 137 digitalWrite(LED, HIGH); 138 139 for (int i = 0; i < NMODE; i++) { 140 Serial.print("setMode(bw: "); 141 Serial.print(Mode[i].bw); 142 Serial.print(", sf: "); 143 Serial.print(Mode[i].sf); 144 Serial.println(")"); 145 146 setMode(Mode[i].bw, Mode[i].sf); 147 148 t = millis(); 149 delay(500); 150 151 Serial.print("send to LoRa: "); 152 buf = (i == 0) ? shortbuf : obuf; 153 Serial.print(buf); 154 LoRa_send(buf); 155 156 while (true) { 157 LoRa_recv(ibuf); 158 if (strstr(ibuf, "OK")) { 159 Serial.print(ibuf); 160 break; 161 } else if (strstr(ibuf, "NG")) { 162 Serial.print(ibuf); 163 break; 164 } 165 } 166 167 if (i != 0) { 168 long s; 169 170 s = Mode[i].timeout * 1000 - (millis() - t); 171 if (s > 0) { 172 Serial.print("delay: "); 173 Serial.println(s); 174 delay(s); 175 } 176 } 177 } 178 179 digitalWrite(LED, LOW); 180} 181 182void setup() 183{ 184 WiFi.mode(WIFI_OFF); 185 186 Serial.begin(115200); 187 delay(20); 188 189 pinMode(LED, OUTPUT); 190 digitalWrite(LED, LOW); 191 192 gps_ss.begin(9600); 193 194 pinMode(sw, INPUT); 195 196 LoRa_ss.begin(115200); 197 pinMode(LoRa_Rst, OUTPUT_OPEN_DRAIN); 198 digitalWrite(LoRa_Rst, HIGH); 199 200 LoRa_reset(); 201 202 delay(1000); // LoRaモジュールをリセットしてからCPUと通信できるまでに1秒程度かかるようだ 203 204 while (LoRa_ss.available() > 0) { 205 char c = LoRa_ss.read(); 206 if (c < 0x80) { 207 Serial.print(c); 208 } 209 } 210 Serial.println(F("\r\nStart")); 211} 212 213void loop() 214{ 215 unsigned long gauge = 0; 216 char buf[128]; 217 218 while (digitalRead(sw) == 0) { 219 gauge++; 220 delay(0); 221 } 222 if (gauge > PUSH_SHORT) { 223 if (gps.location.isValid()) { 224 gps_ss.enableRx(false); 225 send2LoRa(); 226 gps_ss.enableRx(true); 227 } 228 } 229 while (gps_ss.available() > 0) { 230 if (gps.encode(gps_ss.read())) { 231 break; 232 } 233 } 234}

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

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

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

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

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

ozwk

2021/06/17 06:56

> ↓のコードを参考にして このコードの出どころはどこですか?
guest

回答2

0

ベストアンサー

12行目~14行目の部分は,何をしているのでしょうか?

arduino

1extern "C" { 2#include "user_interface.h" 3}

user_interface.hincludeしています。
Arduino/user_interface.h at master · esp8266/Arduino


152行目の

buf = (i == 0) ? shortbuf : obuf;
ここが,何をしているのかまったく理解できません.

i==0のときbufshortbufを、そうでないときobufを代入しています。
そのbuf

Arduino

1LoRa_send(buf);

していますね。

ということはi==0のときはshortbufLoRa_send()して、それ以外はobufsend_LoRa()していますね。

投稿2021/06/17 07:42

ozwk

総合スコア13521

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

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

raspypy

2021/06/17 08:04

分かりやすい説明ありがとうございます。 >i==0のときはshortbufをLoRa_send()して、それ以外はobufをsend_LoRa()していますね。 ここなのですが, どうして,i==0のときは,8桁文字列のshortbufで, それ以外のときは,12桁文字列のobufにしているのでしょうか? ここがよく理解できません.
ozwk

2021/06/17 08:09 編集

大前提なのですが、コードに書いてあるのは「何をしているか」で 「なぜそうしているか」は書いてないです。 したがっていくらコードだけ見ても「なぜそうしているか」は原則わかりません。 (なのでこの手の質問は「書いたやつに聞け」という答えが付きやすいです。)
raspypy

2021/06/17 08:17

この場で的外れな質問をしてしまい,すみませんでした.
guest

0

三項演算子というもんです。
それでぐぐってみれば、解説出てきますよ

投稿2021/06/17 06:18

y_waiwai

総合スコア87749

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

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

raspypy

2021/06/17 06:28

ありがとうございます。とても勉強になりました。 1つ私の理解を確認させてください。 152行目 i==0は常にFalseになる (139行目~のfor文が終了したあと,iの値が0にセットされていないので) 変数bufには,obufの値が代入される 私の理解が正しいか分かりませんが,正しいとすると, shortbufの値が変数bufに代入されることはないように思うのですが,なぜ,shortbufの値が用意されているのでしょうか?
y_waiwai

2021/06/17 06:33

本当に i は0にはならないんでしょうか よくかんがえましょう
y_waiwai

2021/06/17 06:34

って、実際に走らせてみればわかるんじゃないの?
raspypy

2021/06/17 08:00 編集

for文の範囲を間違えて解釈していました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問