回答編集履歴

1

2020/07/23 03:55の返信

2020/07/23 08:53

投稿

maai
maai

スコア463

test CHANGED
@@ -15,3 +15,123 @@
15
15
  https://www.arduino.cc/en/Tutorial/BuiltInExamples#strings
16
16
 
17
17
  https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/equals/
18
+
19
+
20
+
21
+ ---
22
+
23
+
24
+
25
+ 追記:コメント欄はフォーマットが効かないので、ここに書きます。
26
+
27
+ 2020/07/23 03:55の返信です。
28
+
29
+
30
+
31
+ 原因はよく分からなかったのですが、とりあえず以下の問題があり、これらをクリアしたら動きました。
32
+
33
+
34
+
35
+ * バッファオーバーフローが発生しています
36
+
37
+ * 見えない文字(改行など)を想定していません
38
+
39
+ * 読み込みし終わる(想定?)前に1.2.3.が走ります
40
+
41
+
42
+
43
+ ##### バッファオーバーフローが発生しています
44
+
45
+
46
+
47
+ ```
48
+
49
+ char dat[4]; // 格納用文字列
50
+
51
+ ```
52
+
53
+
54
+
55
+ 読み込む文字は `of01` 等、終端文字を入れて5バイトなので、4バイトでは足りません。なので、`count` 等が破壊される可能性があります。
56
+
57
+ (質問文では32バイトなのに…)
58
+
59
+
60
+
61
+ ##### 見えない文字(改行など)を想定していません
62
+
63
+
64
+
65
+ シリアルモニターの設定で回避出来ますが、改行文字`'\n'`等を読み取ってしまいます。
66
+
67
+ `in01=\n` という文字列が来たとき、次に`in01=\n` を受けても、`=`の解釈時にdatは`\nin01=`となっているので、どれにもequalsになりません。
68
+
69
+
70
+
71
+ ```cpp
72
+
73
+ if (Serial.available()) {
74
+
75
+ int chr = Serial.read();
76
+
77
+ if (chr >= 31) { // 可視文字または半角スペースを受け取ったとき
78
+
79
+ dat[count] = chr;
80
+
81
+ ```
82
+
83
+
84
+
85
+
86
+
87
+ ##### 読み込みし終わる(想定?)前に1.2.3.が走ります
88
+
89
+
90
+
91
+ 多分、`on01xxxxxx` な入力をしても反応するのでは?
92
+
93
+ 読み込みが完了したかどうかのフラグを入れると良いと思います
94
+
95
+
96
+
97
+ ```cpp
98
+
99
+
100
+
101
+ void loop(){
102
+
103
+ bool fire = false;
104
+
105
+
106
+
107
+ // 略
108
+
109
+
110
+
111
+ dat[count] = Serial.read();
112
+
113
+ if (count > 30 || dat[count] == '=') {
114
+
115
+ fire = true;
116
+
117
+
118
+
119
+ // 略
120
+
121
+
122
+
123
+ if (fire == true) {
124
+
125
+
126
+
127
+ //1.読み込んだ文字が「on01」のときLEDを点灯させる
128
+
129
+ if(String(dat).equals("on01") == true){
130
+
131
+ // ...
132
+
133
+ }
134
+
135
+ }
136
+
137
+ ```