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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

解決済

Bluetooth→ESP32→Arduinoで文字列のシリアル通信を行うと、if文が上手く機能してくれません…

Bayashisu
Bayashisu

総合スコア1

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

2回答

0グッド

0クリップ

537閲覧

投稿2022/11/09 06:24

前提

Ardiunoシリアル通信についての質問です。
Bluetoothを用いてandroidスマホからESP32へ文字データを送信し、そこからさらにUART通信でArduinoMegaへデータを送るプログラムを作成しています。

PC→(Bluetooth)→ESP32→(UART)→Arduino

ここで発生したトラブルですが、ESP32を中継して送られてきた文字列がArduinoの「rec_data」へ格納されているはずが、中身をif()で判別しようとすると、どんな値が入ろうと全て真で返されてしまいます…

実現したいこと

-ESP32から送られてきた文字列をArduinoで検出する。(ifで判別する)

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

エラー無し

該当のソースコード

--------Arduino--------------------------- String rec_data; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() > 0) { rec_data = Serial.readStringUntil(';'); Serial.println(rec_data); Serial.println("-Arduino-"); if (rec_data == "H") { Serial.println("recive1!"); } if (rec_data != "H") { Serial.println("recive2!"); } if (rec_data.equals("H")) { Serial.println("recive3!"); } delay(1000); } --------ESP32--------------------------- #include "BluetoothSerial.h" BluetoothSerial SerialBT; int RX_PIN = 22; // ESP32のRT,TXピン配置(ピン位置変更不可) int TX_PIN = 23; String BT_rec_Data; // Bluetoothから受信した文字 String Ard_rec_Data; // arduinoとのUART通信から受信した文字 void setup() { Serial.begin(115200); // BluetoothやPCへ接続する Serial1.begin(9600, SERIAL_8N1, RX_PIN, TX_PIN); // Arduinoへ接続する SerialBT.begin("ESP32"); // 無線接続する際に表示する名前(なんでもOK) } void loop() { if (SerialBT.available()) //Bluetoothでデータが届いていたら以下を実行 { BT_rec_Data = SerialBT.readStringUntil(';'); //「;」までデータを受信する指示 Serial.println(BT_rec_Data); // Serial(ArduinoIDEなどのUSB接続先)へデータをオウム返し SerialBT.println(BT_rec_Data); Serial1.println(BT_rec_Data); // Serial1(ArduinoのTx1ピンRx0ピン)へデータを送信 } delay(1000); }

試したこと

if内での判別方法で、「=」「==」「.equals()」の三つを試しました。

「=」と「.equals()」では文字列に関係無く全て真として表示、(!=は偽として表示)
「==」では何の文字列に関係なく全て偽として表示、(!=は真として表示)

シリアルモニタの画像です。(17行目に変更があります)

イメージ説明

イメージ説明

正直何が起きているのかさっぱりです……

補足情報(FW/ツールのバージョンなど)

ArduinoIDE,VScode

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答2

0

ベストアンサー

ESP32から送られてきた文字列をArduinoで検出する。(ifで判別する)

これだけでは何を送ってどう判別したいのかわかりませんが、とりあえず「現状ではよろしくない」ことだけは言えます。

まず、'='の動作。

C/C++(Arduino言語はC++ベース)では、=は代入の演算子です。初期化のための文字であることはありますがそれも代入のようなものなので、それ以外の動作はしない、と考えてよいでしょう。BASICの類をやってきた人にとってはそうでないような気がする場合があるかも知れませんが、C/C++ではこれが比較の動作をすることはありません。
で。代入の演算子は、右辺の値を左辺に代入し、代入した値を式の値として返します。
if( rec_data = "H")
とするならば、rec_data = "H"という代入が行われてrec_dataの値は"H"となり、この式全体が"H"という非0の値を返すのでif文はカッコ内が真であるという判断になり、そのように動作します。そして、この代入によってrec_dataは"H"になったのですから、以降rec_data!="H"は必ず偽になり、rec_data.equals("H")は必ず真になります。

つぎに、Serialの動作。
Serial.println(データ)は、データを送信した後、行末コード'\n'を送信します。
一方、Serial.readStringUntil(指定文字)は、シリアルから指定文字が送られてくるまでデータを蓄積して、指定文字を受信するかタイムアウト(時間切れ、初期値1秒)したら受信済みのデータを文字列として返します(指定文字は含みません)。
質問のプログラムでは、送信側でSerial.println('H');とすれば'H''\n'が送信され、それを受信した側ではSerial.availableは2になります。そこでSerial.readStringUntil(';')を実行すると、';'なんて送られて来ませんから、1秒経った時点で時間切れで"H\n"がデータとなります。これと"H"とを比べても必ず「異なる」という結果になります。

投稿2022/11/09 13:01

thkana

総合スコア7323

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

0

if (rec_data == "H") {

ここのところで、rec_data になにが入ってるのかプリントアウトしてみよう。

投稿2022/11/09 06:29

編集2022/11/09 06:32
y_waiwai

総合スコア86007

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

y_waiwai

2022/11/09 06:34

って、プリントアウト結果にきちんと出てるやんw
y_waiwai

2022/11/09 06:38

文字と改行が入ってますね
Bayashisu

2022/11/09 07:02

ご回答ありがとうございます! 改行関係が悪さしている感じですかね…マイコン同士のUART通信を行ったのが今回で初めてなので、送信データについては正直あまりよくわかっていません。こんな場所で躓くとは……
y_waiwai

2022/11/09 07:33

こういう場合でよくあるのは見えない文字が混ざるってやつなので、プリントアウトするだけではなく、文字数とバイナリデータも出すようにすると、いろいろみえてきます
thkana

2022/11/09 12:23

> 改行関係が悪さしている 誰か(何か)が「悪さ」をしているのですか? 厳しい言い方をしますが、コンピュータはあなたが与えたプログラムの通りに動いているだけです。「あまりよくわかっていない」のを言い訳に適切でないプログラムを与えたからその通りに動作しているということなのですが。
Bayashisu

2022/11/09 14:28

ご回答ありがとうございます。 thkanaさんの気に障られるような発言をしてしまい申し訳ございませんでした。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。