2016-10-05 7 views
0

このソースコード全体を投稿することなく、誰でもこのboolが値を変更している理由を知ることができますか?なぜこのブールは変化していますか?

const int redLed = 31; 
const int greenLed = 33; 
const int blueLed = 35; 
const int irSensor = 2; 
const int doorRelayPin = 14; 
bool isDenied = false; 
byte inputCard[4]; 
char cardID[4]; 
char passCode[10]; 
int passCount = 0; 
char masterCode[10] = "1"; 

void loop(){ 
    if(isPanic){ 
     panicCounter++; 
     int interval = panicCounter % 2000; 
     Serial.println(interval); 
     if (interval == 0){ 
     tryPost(); 
     } 
    }else{ 
     if (!digitalRead(doorRelayPin) && !isDenied){ 
     greenSolid(); 
     }else if(digitalRead(doorRelayPin) && !isDenied){ 
     blueSolid(); 
     t.stop(unlock); 
     } 
    } 
    Serial.print("isDenied bool: "); 
    Serial.println(isDenied); 
} 

そして、あなたは出力を理解するための関連するコードの次のビット...

Serial.println(F("Scanned PICC's UID on reader 1:")); 
for (int i = 0; i < 4; i++) { // 
    inputCard[i] = idReader.uid.uidByte[i]; 
    Serial.print(inputCard[i], HEX); 
} 
Serial.println(""); 
idReader.PICC_HaltA(); // Stop reading 
getCardID(); // Get data ready 
return 1; 

あなたは、私がこのブールANYWHEREの値を変更しておりません見ることができるように、しかし、シリアル出力とループ機能の私のif statementは値が変わったと言っています。それは読書とRFIDカードの間にPICC機能の間に起きているようです。ありがとう!以下

シリアル出力。

isDenied bool: 0 
isDenied bool: 0 
isDenied bool: 0 
isDenied bool: 0 
isDenied bool: 0 
isDenied bool: 0 
Scanned PICC's UID on reader 1: 
F539A76B 
isDenied bool: 54 
ip=10.10.1.50&passcode=&rfid=f539a76b 
connecting...Connected 
disconnecting. 
grant 10.10.1.50 
Access Granted. 
isDenied bool: 54 
isDenied bool: 54 
isDenied bool: 54 
isDenied bool: 54 
isDenied bool: 54 
isDenied bool: 54 

私は右if(isPanic)の文の上にループ機能でこれを行うことにより、この問題を「ハック」しようとした場合、それがさらに奇数にするために、ブール値は変わることはありません。しかし、これらは、新たな文はどちらかが満たされることはありません場合は、出力ログは、これら2つのテストSerial.printlnさん

if (isDenied == 54){ 
    isDeniedBoolRecoverCounter++; 
    Serial.println("In this"); 
} 
if (isDeniedBoolRecoverCounter > 10){ 
    Serial.println("In the other one"); 
    isDenied = false; 
    isDeniedBoolRecoverCounter = 0; 
} 
+4

そして、あなたはどこでも 'isDenied'への割り当てを持っていませんか? 'isDenied'を取り巻く変数はどうでしょうか?配列はありますか?あなたは多分配列の境界から書き出しますか?正しく初期化されていないポインタを使用しますか? –

+0

ネガティブ。あなたが見ているのはあなたが見るものです。私はもっ​​と多くのコードがあることを意味しますが、私はすべてのクラスを通して何度も検索し、 'isDenied'はその関数中に他の場所に割り当てられません。私はこれをtrueに設定すると、そのほかに、値が、とにかく '1'ではない54の... – TheValyreanGroup

+0

2つの理由:1)isDenied変更を呼び出される機能の一つ。つまり、どこにいても決して変更されなければ、なぜそれが最初の場所にあるのでしょうか? 2)Joachimが言っているように、おそらく読み込み関数から配列/ポインタを正しく初期化していません... – Lagerbaer

答えて

0

よしのいずれかを示していない、あなたたちは正しかったです。変数cardID[]に関するバッファオーバーランの問題でした。もともとは、それが正常に戻って戻ったが、それは問題である確認にそれを絞り込む後、私は問題を解決しましたどのcardID[] = "";を試してみました、しかしisDeniedブールはまだ、一時的に変更されましたcardID[4] = "";として初期化されました。最終的に正しい宣言はchar cardID[8] = "";

私はまだchar型の配列変数のまわりで私の頭をラップし、それらがどのように初期化/宣言されなければならないんだし。実際に私は(8)文字配列を必要とする場合

私の推測では、私は...ラインと(4)文字char配列に「f539a76b」を割り当てることが

sprintf(cardID, "%02x%02x%02x%02x", inputCard[0], inputCard[1], inputCard[2], inputCard[3]); 

をしようとしていましたさ。

+0

アンサーは、さらなる質問をするのに適切な場所ではありません。既存の質問にこれらの追加質問を追加するか、必要に応じてその他の質問を開くことを検討してください。 – Thebluefish

+1

私はこの回答を編集しました。 – TheValyreanGroup

+0

@TheValyreanGroup - char配列を 'sprintf'のバッファとして使うつもりなら、最後にバイトを試して計算し、配列を作るのにどれくらいの大きさが必要ですか?その方法はある時点で失敗することになります。あなたが予想していたよりも配列を大きくしてください(それは素晴らしい解決策ではありません)。最良の解決策は、 'std :: ostringstream'を使うことです。 – PaulMcKenzie

関連する問題