07-02-2026, 19:02
(Ten post był ostatnio modyfikowany: 07-02-2026, 19:04 przez Fireisland.)
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:
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:
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):
Serial output:
Natomiast jak tylko dodam przepisywanie treści SMSa do tablicy znaków:
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:
Gdzie robię błąd ?
Pozdrawiam,
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,

