Chyba je asi tedy jinde, než jsem myslel já, ptám se tedy co je chybné na mém postupu, ke kterému jsem došel a kde dělám chybu.
V GSM modulu je nějaký buffer
V Arduinu je také nějaký buffer
- standardní velikost je 64 "znaků"
- nevím, kolik je to u arduina Mini Pro
Pokud něco posílám do GSM, naplní se buffer v GSM mým příkazem a GSM si to postupně vyčte, až má čas.
Když něco pošle GSM, naplní se buffer v Arduinu a já jej musím vyčíst.
Když jej nevyčtu, tak přepisuje staré znaky novými.
Můj program je nastaven takto:
Vyčisti (příchozí) buffer v arduinu, který může obsahovat kromě odpovědí na mé příkazy, různé servisní info z GSM modulu (přišla SMS, hovor, nízké napětí...)
Kód: Vybrat vše
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
}
Přidal jsem tam delay(50) aby se vyčítal pomaleji - nevím, zda to pomáhá
Přidal jsem tam mezi smyčky delay(100) aby se mohl dotéct další text - nevím, zda to pomáhá
a zopakoval jsem to 3x
Kód: Vybrat vše
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
delay(50); // aby se stihl buffer vymazat
}
delay(100);
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
delay(50); // aby se stihl buffer vymazat
}
delay(100);
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
}
Pošlu dotaz na SMS a jak jsem vyčetl v jiných programech, čekám delay(100) než odpoví GSM modul
Kód: Vybrat vše
komunikaceSIM800L.println("AT+CMGR=1");
delay(100);
Pak chci vyčíst odpověd, protože se mi stávalo (nevím proč), že mi to načetlo jen první část, opět jsem přidal delay(50), aby to vyčítalo pomaleji a proces 2x zopakoval. Nevím, zda je to obojí potřeba. Ale odpověď již pak byla v řetezci celá.
Kód: Vybrat vše
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
odpsms = odpsms + s;
delay(50);
}
delay(100);
while (komunikaceSIM800L.available() > 0) {
s = komunikaceSIM800L.read();
odpsms = odpsms + s;
delay(50);
}
Kód: Vybrat vše
char odpsmsprevod[odpsms.length() + 1];
odpsms.toCharArray(odpsmsprevod, odpsms.length() + 1);
if ((strstr(odpsmsprevod, "+420xxxxxxxxx") != NULL) && (strstr(odpsmsprevod, "ZAPNI") != NULL)) {
// Serial.println("ssssssss - splněna podmínka 737 a ZAPNI");
digitalWrite(LED2, HIGH);
delay(1000);
akce = 1;
}
No a zde je problém,v arduino MEGA to funguje, ale v MINI PRO to podmínku že obsahuje "+420xxxxxxxxx" registruje, ale text samotné SMS, tedy část "ZAPNI" už ne.
Protože se mi tam nevejde kvůli velikosti paměti knihovna SoftwareSerial.h, nemůžu sledovat výstupy na monitoru, tak je sleduji jen dle signalizačních ledek...