Q&A (電気電子)

Arduinoではbreak文に近いと直前の構文がスルーされることがある

勘違いかもしれませんが、もしかしたらそういう特性があるかもしれないので、メモしておきます。

問題のプログラム

今回Arduinoをいじっていて1か所納得がいかないところがありました。

全部乗せると長いので一部分を以下に載せます。

 if(pass_count==PASS_SIZE){
    int flag=0;
    while(i<PASS_SIZE){
      if(pass_rev[i]!=passcode[i]){
        flag=-1;
        //break文と近すぎると、なぜか抜けてしまう模様。
        Serial.print("ブレイク前のflag=");
        Serial.println(flag);
        
    break;
      }else{
        flag=1;   
      }
      i++;
    }

if文とwhile文で構成された単なるフラグ判定のためのプログラムなんですが、問題は以下の部分です。

if(pass_rev[i]!=passcode[i]){
        flag=-1;
        //break文と近すぎると、なぜか抜けてしまう模様。
        Serial.print("ブレイク前のflag=");
        Serial.println(flag);
        
    break;
      }

この一つ目の条件分岐において、break文が実行される直前までは、上のプログラムは全て実行されるはずなのですが、

flag=-1;

の代入が不発に終わることがありました。

これ以前ではフラグは利用していないので、特に悪影響等を及ぼされている可能性は低いと思うのですが、いろいろ調節してもうまくいきませんでした。

Arduinoの処理自体流れるように進むので、もしかしたら速すぎて代入できてない?のかもしれません。

修正したプログラム(一応うまくいきました。)

一応以下のようにdelayをはさんでタイムラグを設けてやるとうまくいきました。

 if(pass_rev[i]!=passcode[i]){
        flag=-1;
        delay(100);
        Serial.print("ブレイク前のflag=");
        Serial.println(flag);
        break;
      }

ただこれでもあんまり納得いかないんですよね。

flag判定が上手くいかないからdelayを入れるのは分かるんですが、flagの後ろに入れてるのにうまくいってしまうんですよねぇ、、、

全く謎です。。。

ちなみにSerial.print関係はしっかり表示されるので、これもまた謎ですね、、

たまたまハード的に行けない部分なのか、ほかの部分で悪さされているのか、、よくわかりません。

原因が分かる方がいれば教えていただきたいところですね。

コメント

今回はよくわからないバグ?でした。

バグなのかもわかりませんが。

ただ今後代入などが上手くいかないことがあったらこういうケースもある、ということで、頭に入れておきたいと思います。

理由が分かったら修正投稿します。

それでは。

-Q&A (電気電子)
-, ,