Sms tartalmának beolvasása?

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

Sms tartalmának beolvasása?

HozzászólásSzerző: Kotesz » 2020. február 5. szerda, 13:14

Sziasztok!

Egy Sim800 és egy Arduino a project alapja.
Egy fóliasátor öntöző vezérlés lenne a feladat.
Smsben elküldi a gazda hogy mikor meddig legyenek a szelepek bekapcsolva.
Rendszer minden nap 1x lekérdezi van e új beállítás és a következő nap aszerint cselekzik.

A probléma az sms adatok letárolásával van.
Az alábbi kóddal szeretném az 1 helyen lévő smst beolvasni és letárolni egy stringbe.

Kód: Egész kijelölése

void setup()
{
mySerial.begin(9600);             
Serial.begin(9600);    /
clock.begin();
delay(500);
pinMode(11,INPUT);
pinMode(10,INPUT);
pinMode(modem, OUTPUT);
pinMode(led, OUTPUT);
pinMode(bled, OUTPUT);
digitalWrite(modem,LOW);
delay(200);
digitalWrite(modem,HIGH);
mySerial.println("Modul bekapcsolva");
delay(15000);
//CheckNet();
mySerial.println("Sms fogadasra kesz...");
Serial.println(F("AT+CMGF=1\r"));
delay(100);
Serial.println(F("AT+CNMI=2,1,0,0,0\r"));
delay(100);
bufTorles(),
delay(300);

delay(500);

}

 void bufTorles()
 {
    while(Serial.available() > 0)
    {
        Serial.read();
    }
}

void loop()
{
 
read_sms();
while(1);

}
 

String read_sms()
{
 int x=0;   //
 
 String sms = "";   
 
 unsigned long int prv_millis = millis(); 
 Serial.println(F("AT+CMGR=1\r"));
 delay(300);
   
 while(1)
 {

 
  if(Serial.available() >0)
 {
   
    char incoming_sms=Serial.read();
   
    sms += incoming_sms; 

     prv_millis = millis();

     x++; 
 }

 unsigned long int new_millis = millis();
 
 if((x>0)&&((new_millis - prv_millis)>300)) 
 
 break;
 }

     mySerial.print("Fogadott adatok =");
     mySerial.println(sms);
     
 


}


A fogadott adatoknál csak ennyi jelenik meg a terminalban:

Kód: Egész kijelölése

+CMGR: "REC READ","+XXXXXXXXXXXX",,"20/02/05,12


ha terminal ablakban kérem le az sms-t akkor ezt kapom:

Kód: Egész kijelölése

+CMGR: "REC READ","+XXXXXXXXXXXX",,"20/02/05,12:36:09+04
12345678901234567890


Ezt hogyan tudom orvosolni?
Mintha nem tudná a soros porti adatokat mindet letárolni a stringbe.

Köszönöm a segítséget.

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10032
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Sms tartalmának beolvasása?

HozzászólásSzerző: Robert » 2020. február 5. szerda, 17:19

Tipp:
1, A String sms = ""; sorban nem definiálod/puffereled a várható hossz.
char sms[15] = "";

2, a bejövő karakter a "0x00" kódú karakter, ami stringen belül a sorvéget jelenti.
Illetve a terminal helyett a br@y terminált használd és mutassa a kapott kód HEXA értékét is. Lehet hogy a 0, 10 vagy 13 kódú karakter....
http://www.tavir.hu - a gazda :)

Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

Re: Sms tartalmának beolvasása?

HozzászólásSzerző: Kotesz » 2020. február 6. csütörtök, 9:52

átírtam a kódot:

Kód: Egész kijelölése

char incomingByte,incoming_sms[160];

void loop()
{
 
    Serial.println(F("AT+CMGR=1,0\r"));
    int index=0;

    delay(1000);
   if (Serial.available())
   {
    delay(100);
    while(Serial.available()>0)
    {
      incomingByte = Serial.read();
      incoming_sms[index] = incomingByte;
      index++;
      if (index>159)
    {
        incoming_sms[index]= '\0';
        break;
    }
    }
    delay(10);
    mySerial.println(incoming_sms);
}
  while(1);
  }


Ezt kapom a br@y terminalban is:

Kód: Egész kijelölése

Terminal log file
Date: 2020.02.06. - 9:49:40
-----------------------------------------------
2020.02.06, 9:49:52.403, Sms fogadasra kesz...
2020.02.06, 9:49:54.373, AT+CMGR=1,0
2020.02.06, 9:49:54.373,
2020.02.06, 9:49:54.373,
2020.02.06, 9:49:54.373, +CMGR: "REC READ","+36xxxxxxxxx","","20/02/05,13

-----------------------------------------------
Date: 2020.02.06. - 9:49:58
End log file


Hexa-ban pedig:

Kód: Egész kijelölése

Terminal log file
Date: 2020.02.06. - 9:51:19
-----------------------------------------------
4D 6F 64 75 6C 20 62 65 6B 61 70 63 73 6F 6C 76
61 0D 0A 53 6D 73 20 66 6F 67 61 64 61 73 72 61
20 6B 65 73 7A 2E 2E 2E 0D 0A 41 54 2B 43 4D 47
52 3D 31 2C 30 0D 0D 0D 0A 2B 43 4D 47 52 3A 20
22 52 45 43 20 52 45 41 44 22 2C 22 2B 33 36 37
30 33 34 31 30 36 30 37 22 2C 22 22 2C 22 32 30
2F 30 32 2F 35 2C 31 33 0D 0A 30
-----------------------------------------------
Date: 2020.02.06. - 9:52:08
End log file


Ötlet?

Avatar
Kotesz
Tranzisztorgyógyász
Hozzászólások: 171
Csatlakozott: 2009. szeptember 24. csütörtök, 6:00

Re: Sms tartalmának beolvasása?

HozzászólásSzerző: Kotesz » 2020. február 6. csütörtök, 10:50

Elképzelhető hogy a soros puffer megtelik? és nem tud többet eltárolni?
Ha igen hogyan lehet a többi adatot is megszerezni?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 10032
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: Sms tartalmának beolvasása?

HozzászólásSzerző: Robert » 2020. február 6. csütörtök, 21:43

char incomingByte,incoming_sms[160]; helyett
char incomingByte,incoming_sms[255];

és

if (index>159) helyett
if (index>254)

Mit csinál?
http://www.tavir.hu - a gazda :)


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég