• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Odczytywanie SMSów z modułu GSM SIM800L
#1
Cześć,

Pracuję nad układem, który powinien mieć możliwość odczytywania SMSów z komendami sterującymi jak również powinien odsyłać SMSy potwierdzające lub informujące o stanie układu. 
Używam Arduino UNO i modułu GSM SIM800L z zewnętrzną anteną, zasilanego z przetwornicy step-down XL4015E1 zasilanej z akumulatora 12V i ustawionej aby na wyjściu dawała 4V. 

Do obsługi modułu używam biblioteki GSMSim:
Biblioteka GSMSim

Bazuję na załączonym w opisie biblioteki przykładzie do odbierania SMSów. Po odebraniu SMS wywoływana jest odpowiednia funkcja z owej biblioteki, która koniec końców zwraca Stringa w takiej postaci:

Cytat:"FOLDER:INCOMING|STATUS:UNREAD|PHONENO:+48123456789|DATETIME:26/01/20,19:49:39+04|MESSAGE:HelloWorld";

Z takiego Stringa chcę "wyciągnąć" tylko treść SMSa, a więc wszystko co znajduje się za "MESSAGE:".
Napisałem kilka prostych linijek kodu, który iteruje po znakach tego Stringa zaczynając od końca aż do napotkania znaku dwukropka. Następnie zapisywany jest indeks pod którym znajduje się dwukropek i w kolejnej pętli uzupełniana jest tablica znaków (textSms) do której przepisywane są poszczególne znaki począwszy od dwukropka aż do końca Stringa. 
W ten sposób tablica textSMS powinna zawierać tylko sam tekst SMSa, który został wysłany z telefonu. 

Problem w tym, że gdy tylko próbuję jakkolwiek użyć uzupełnionej w ten sposób tablicy znaków textSMS to nawet ten String odebrany z modułu GSM nie jest odbierany w całości, a np. tak:

Cytat:"FOLDER:INCOMING|STATUS:UNREAD|PHONENO

Poniżej przykład gdy odczytywanie działa prawidłowo (przepisanie Stringa zwróconego z funkcji z biblioteki GSMSim do tablicy znaków recvSms i wypisanie w konsoli):

Kod:
char recvSms[200]; //bufor na caly lancuch odebrany z modulu GSM
strncpy(recvSms, sms.readFromSerial(buffer).c_str(), 110);//przepisanie odebranego Stringa do tablicy znakow
recvSms[strlen(recvSms) + 1] = '\0';
Serial.print("Recv SMS: "); Serial.println(recvSms);

Serial output:
Cytat:17:43:59.293 -> Recv SMS: FOLDER:INCOMING|STATUS:READ|PHONENO:+48123456789|DATETIME:26/02/07,17:43:52+04|MESSAGE:Hello

Natomiast jak tylko dodam przepisywanie treści SMSa do tablicy znaków:

Kod:
char textSms[160]; //bufor tylko na tresc SMSa
char recvSms[200]; //bufor na caly lancuch odebrany z modulu GSM
strncpy(recvSms, sms.readFromSerial(buffer).c_str(), 110);//przepisanie odebranego Stringa do tablicy znakow
recvSms[strlen(recvSms) + 1] = '\0';
Serial.print("Recv SMS: "); Serial.println(recvSms);
//wypisanie samej tresci SMSa
      for (int i = (strlen(recvSms) - 1); i > 0; i--)
      {
        if (recvSms[i] == ':')
        {
          for (int j = i; j < (strlen(recvSms) - 1); j++)
          {
            textSms[j - i] = recvSms[j];
          }
          break;
        }
      }
Serial.print("Text SMS: "); Serial.println(textSms);

To String, który wcześniej prawidłowo się zapisywał (recvSms) przyjmuje postać jak poniżej (jest niepełny); przez to również zawartość textSms jest niepoprawna. 

Serial output:

Cytat:17:54:31.974 -> Recv SMS: FOLDER:INCOMING|STATUS:READ|PHONENO:

Gdzie robię błąd ?

Pozdrawiam,
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości