みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Arduinoのプログラムのループ文

ESP-wroom-32のプログラムを勉強している時にループ文について気になることがあったのですが、



void mqttLoop() {

Serial.print("mqttLoop() area01: ");

if (!mqttClient.connected()) {
connectAWSIoT();

}
mqttClient.loop();

long now = millis();
if (now - lastMsg > 2000) {
lastMsg = now;
++value;
snprintf (msg, 75, "hello world #%ld", value);
Serial.print("Publish message: ");
Serial.println(msg);
//mqttClient.publish("msg/comment", msg);
Serial.print("mqttLoop() area02: ");
}


}


void loop() {
mqttLoop();
}



void loop() という関数を宣言して、それをmqttLoop() 関数内で

”mqttClient.loop();”

これを置くと、mqttLoop関数が無限ループ状態になっているのですが、これはArduinoの無限ループの特殊なやり方なのでしょうか?

自分がやっているC言語の無限ループだと

while(1){.........}

これが普通のやり方だと思うのですが、どうぞご教示の程よろしくお願い致します。

投稿日時 - 2019-01-28 19:34:41

QNo.9582351

すぐに回答ほしいです

質問者が選んだベストアンサー

パソコンだと プロンプト に戻ってきています
そのため 今どきの言語だと 戻り値があり 終了しますが



Arduino の ハードに近いものだと 
ループ してます そうしないと暴走状態です


正確に言うと パソコンでも ループ状態で キーボードやマウスの入力を監視してます
初期のパソコンとアセンブラをやってるとわかります 
Z80ですが
https://books.google.co.jp/books?id=naOSqzSobTgC&pg=PA190&lpg=PA190&dq=%E3%83%9E%E3%82%B7%E3%83%B3%E8%AA%9E%E3%80%80%E3%83%96%E3%83%BC%E3%83%88&source=bl&ots=thrs7Dy8lW&sig=ACfU3U3CYQKMNhrtPd4hxAT2Dliaer3bXw&hl=ja&sa=X&ved=2ahUKEwiD34Kp2JDgAhWIvbwKHRq9CR4Q6AEwCHoECAAQAQ#v=onepage&q=%E3%83%9E%E3%82%B7%E3%83%B3%E8%AA%9E%E3%80%80%E3%83%96%E3%83%BC%E3%83%88&f=false

この辺の書籍を読むとわかります
プログラムの流れがハード的に書いてある

投稿日時 - 2019-01-28 23:38:05

お礼

回答頂きありがとうございます。

プログラミングとかニワカでやってても、この辺はハードウェアとかアセンブラ的な知識が必要そうな話のようですね。

void mqttLoop() 関数内で

mqttClient.loop();という文を書いていることの意味みたいなのがよくわからず、永久ループさせるために必要かなと思ったのですが、わざとこの文をコメントアウトさせて動作させても、永久ループは実行されることを確認しました。

なのでvoid loop() という関数内は永久ループすると考えればいいと感じました。


ただ、
mqttのデータを送信させるパブリッシュ動作では特に問題がなかったのですが、amazonのawsなどのブローカーサーバからデータを受信させるためのサブスクライブをやってみようと

Nefry BT(ESP32)でMQTTを使ってみよう Subscribe編 | dotstudio https://dotstud.io/blog/nefry-bt-connect-mqtt/ #dotstudio

こちらのサイトなどを参考にした際に、


void mqttLoop() 関数内で

mqttClient.loop();を記述していないと受信ができないことがわかりました。


なんとなくなのですが、サブスクライブを行うために書いた

mqttClient.subscribe(TOPIC, QOS);
Serial.println("Subscribed.");


というのはプログラム上の記述以外のところで動いてる割り込みとかハンドラ?みたいなやつらしいので、mqttClient.loop();というのはそれに関係しているような気がしています。

助かります。

投稿日時 - 2019-01-30 07:26:22

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問