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

回答編集履歴

1

2020/07/23 03:55の返信

2020/07/23 08:53

投稿

maai
maai

スコア463

answer CHANGED
@@ -6,4 +6,64 @@
6
6
 
7
7
  この辺りを読んでください
8
8
  https://www.arduino.cc/en/Tutorial/BuiltInExamples#strings
9
- https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/equals/
9
+ https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/equals/
10
+
11
+ ---
12
+
13
+ 追記:コメント欄はフォーマットが効かないので、ここに書きます。
14
+ 2020/07/23 03:55の返信です。
15
+
16
+ 原因はよく分からなかったのですが、とりあえず以下の問題があり、これらをクリアしたら動きました。
17
+
18
+ * バッファオーバーフローが発生しています
19
+ * 見えない文字(改行など)を想定していません
20
+ * 読み込みし終わる(想定?)前に1.2.3.が走ります
21
+
22
+ ##### バッファオーバーフローが発生しています
23
+
24
+ ```
25
+ char dat[4]; // 格納用文字列
26
+ ```
27
+
28
+ 読み込む文字は `of01` 等、終端文字を入れて5バイトなので、4バイトでは足りません。なので、`count` 等が破壊される可能性があります。
29
+ (質問文では32バイトなのに…)
30
+
31
+ ##### 見えない文字(改行など)を想定していません
32
+
33
+ シリアルモニターの設定で回避出来ますが、改行文字`'\n'`等を読み取ってしまいます。
34
+ `in01=\n` という文字列が来たとき、次に`in01=\n` を受けても、`=`の解釈時にdatは`\nin01=`となっているので、どれにもequalsになりません。
35
+
36
+ ```cpp
37
+ if (Serial.available()) {
38
+ int chr = Serial.read();
39
+ if (chr >= 31) { // 可視文字または半角スペースを受け取ったとき
40
+ dat[count] = chr;
41
+ ```
42
+
43
+
44
+ ##### 読み込みし終わる(想定?)前に1.2.3.が走ります
45
+
46
+ 多分、`on01xxxxxx` な入力をしても反応するのでは?
47
+ 読み込みが完了したかどうかのフラグを入れると良いと思います
48
+
49
+ ```cpp
50
+
51
+ void loop(){
52
+ bool fire = false;
53
+
54
+ // 略
55
+
56
+ dat[count] = Serial.read();
57
+ if (count > 30 || dat[count] == '=') {
58
+ fire = true;
59
+
60
+ // 略
61
+
62
+ if (fire == true) {
63
+
64
+ //1.読み込んだ文字が「on01」のときLEDを点灯させる
65
+ if(String(dat).equals("on01") == true){
66
+ // ...
67
+ }
68
+ }
69
+ ```