void loop() { // run over and over
keypad();
}
void keypad(){
// Send base information and password request
mySerial.write(88);
Je ti jasné, že to 88 posíláš ve smyčce pořád dokola? Ta odpověď nestihne přijít včas na to, aby ten následující if hned něco provedl. Takže se zamysli nad časováním.
if (mySerial.available() > 0){
int status=mySerial.read();
if (status==1){
while (mySerial.available() > 0){
Tady počítáš s tím, že ten přenos bude dost rychlý na to, aby celé heslo bylo v paměti dřív, než proběhne ten tvůj while. No a ono nebude. Pošli si nejdřív délku, ať víš kolik znaků čekat. available() ti jenom řekne, jestli čekají přijatá data v bufferu.
int intByte= mySerial.read();
password+=(int)intByte;
Plus? Cože si to posíláš? Co je password? String? Takhle se totiž stringy v C nespojují..
Klavesnice:
void loop() { // run over and over
called=mySerial.read();
if (called==ID){
serialInterrupt();
}
Serial.println(armState);
}
A co když to ID nesedí? To je pak zpráva pro někoho jiného a měl bys ji celou ignorovat než zase začneš čekat na ID. Další důvod proč posílat i délku.
void serialInterrupt(){
mySerial.write(1);
mySerial.write(passwd);
if (mySerial.available() > 0){
armState = mySerial.read();
}
Zase available(). Ono to opravdu udělá něco jiného než čekáš. Tady by asi mělo být spíš while(!mySerial.available());
if (mySerial.available() > 0){
passwordState = mySerial.read();
}
A tady taky.
Problem je ze v kodu klavesnice dostavam do promennych "armstate" nebo "passwordState" hodnotu 88, tedy oznaceni startu komunikace s pozadovanou klavesnici.
Tomu se vůbec nedivím. To Arduino běží na 16Mhz, TTL UART je tam typicky nastavený na 115200 baud (nebo dokonce jen 9600), tj nepočítej s tím, že ti přijde odpověď hned v čase pro další instrukci. Synchronizaci ti musí dělat ty zprávy a to Arduino na ně musí počkat. Druhá věc je to, že posíláš výzvu 88 pořád dokola místo čekání na odpověď a neznáš délku odpovědi, abys rozhodl, že už ji máš celou.