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

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

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

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

Q&A

解決済

2回答

9093閲覧

arduinoで無限ループしてしまう。

akito0705

総合スコア23

Arduino

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

0グッド

2クリップ

投稿2018/01/11 16:26

Unity,arduinoでプログラミングをしています。
UnityからArduinoでシリアルデータを送り、ロボットを動かそうとしています。
Loop文の中で、While文でSerial.availableを使っているのですが、なぜか電源を起動した瞬間に(シリアルデータを送っていない状態でも)このWhile文の中を無限ループしています。
原因がわからずつまづいています。よろしくお願いします。
Unity側に問題はないと思います。

Unity側から送られてくるのは、A,B,C,Tと数値です。数値は必ずAの後に来るようにしています。これを配列に格納し、一気にWhile文でArduino側に送り、それに対応した動作を順番に行わせたいです。

void loop() {
if(Serial.available()>0){
dischar[15]={};
a=0;
b=0;
c=0;
int i=0;
flag=1;
distance=0;
while(Serial.available()>0){
dischar[i] = Serial.read();
i++;
}
for(b=0;b<i+1;b++){
if(dischar[b] = 'A'){
flag=2;
}else{
if(isalpha(dischar[b]) != 0){
if(flag==2){
a = a+1;
}
flag=1;
}else{
strnum[a] = strnum[a] + dischar[b];
}
}
}
a=0;
for(c=0;c<i+1;c++){
if(dischar[c] == 'A'){
}else if(dischar[0] == 'B'){
forward();
delay(1000);
stop();
delay(1000);
}else if(dischar[0] == 'C'){
forward();
delay(1000);
stop();
delay(1000);
}else if(dischar[0] == 'T'){
turn();
delay(2000);
stop();
delay(1000);
}else{
distance = atoi(&strnum[a]);
distime=distance*1000;
forward();
delay(distime);
stop();
delay(1000);
a=a+1;
}
}
}
}

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

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

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

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

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

MasahikoHirata

2018/01/11 18:57

ソースの添付はteratailの規則に基づいて行っていただければ回答しやすいです。
ozwk

2018/01/15 00:34

「このWhile文の中を無限ループしてい」るというのはどうやって確かめたんですか?
guest

回答2

0

自己解決

自己解決しました、ありがとうございました。コメント通りシリアルデータの読み取り方を変え、IF文の使い方を変えたらうまくいきました。
無限ループの確認方法としてはWhile文のなかに、前進、1秒停止の動作を配置して確認しました。

投稿2018/01/16 14:07

akito0705

総合スコア23

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

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

0

ある意味、自己満足な部分とか感じながら。
ソースが読みにくいので整形してみた。
(何故?このサイトのルールに基づいての記載が出来ないのかが疑問だけど)

arduino

1void setup() { 2 // put your setup code here, to run once: 3 4} 5 6void loop() { 7 if(Serial.available()>0){ 8 dischar[15]={}; 9 a=0; 10 b=0; 11 c=0; 12 int i=0; 13 flag=1; 14 distance=0; 15 while(Serial.available()>0){ 16 dischar[i] = Serial.read(); 17 i++; 18 } 19 for(b=0;b<i+1;b++){ 20 if(dischar[b] = 'A'){ 21 flag=2; 22 }else{ 23 if(isalpha(dischar[b]) != 0){ 24 if(flag==2){ 25 a = a+1; 26 } 27 flag=1; 28 }else{ 29 strnum[a] = strnum[a] + dischar[b]; 30 } 31 } 32 } 33 a=0; 34 for(c=0;c<i+1;c++){ 35 if(dischar[c] == 'A'){ 36 }else if(dischar[0] == 'B'){ 37 forward(); 38 delay(1000); 39 stop(); 40 41 delay(1000); 42 }else if(dischar[0] == 'C'){ 43 forward(); 44 delay(1000); 45 stop(); 46 delay(1000); 47 }else if(dischar[0] == 'T'){ 48 turn(); 49 delay(2000); 50 stop(); 51 delay(1000); 52 }else{ 53 distance = atoi(&strnum[a]); 54 distime=distance*1000; 55 forward(); 56 delay(distime); 57 stop(); 58 delay(1000); 59 a=a+1; 60 } 61 } 62 } 63} 64

先ずはフォローチャートなどを考えて、全体の処理の流れを整理すべきと思います。
”なぜか電源を起動した瞬間”とありますが、起動状態でのarduinoの状態を理解されていますか?
またループの初めに”dischar[15]={};”とありますが、毎回行う処理?
どのような動きを期待しているか?難解です。

投稿2018/01/11 19:17

MasahikoHirata

総合スコア3747

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

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

MasahikoHirata

2018/01/14 20:01

読み直して誤字訂正”フォローチャート”⇒”フローチャート”。また低評価を付けた方、私より良い回答の記載を期待しています。問題は解決しておりません。また低評価な部分の記載もお願いします。後学のため。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問