Skocz do zawartości

Prośba o pomoc z "przeróbką" biblioteki


SOYER

Pomocna odpowiedź

Cześć, jak wiadomo z tego tematu ,pracuję nad przeróbką tej biblioteki.

Mamy w tej bibliotece funkcję smsRead

String GSMSim::smsRead(uint8_t index) {

this->print("AT+CMGR=");

this->print(index);

this->print(",0\r");

_buffer = _readSerial();

String durum = "INDEX_NO_ERROR";

if (_buffer.indexOf("+CMGR:") != -1) {

String klasor, okundumu, telno, zaman, mesaj;

klasor = "UNKNOWN";

okundumu = "UNKNOWN";

if (_buffer.indexOf("REC UNREAD") != -1) {

klasor = "INCOMING";

okundumu = "UNREAD";

}

if (_buffer.indexOf("REC READ") != -1) {

klasor = "INCOMING";

okundumu = "READ";

}

if (_buffer.indexOf("STO UNSENT") != -1) {

klasor = "OUTGOING";

okundumu = "UNSENT";

}

if (_buffer.indexOf("STO SENT") != -1) {

klasor = "OUTGOING";

okundumu = "SENT";

}

String telno_bol1 = _buffer.substring(_buffer.indexOf("\",\"") + 3);

telno = telno_bol1.substring(0, telno_bol1.indexOf("\",\"")); // telefon numarası tamam

String tarih_bol = telno_bol1.substring(telno_bol1.lastIndexOf("\",\"") + 3);

zaman = tarih_bol.substring(0, tarih_bol.indexOf("\"")); // zamanı da aldık. Bir tek mesaj kaldı!

mesaj = tarih_bol.substring(tarih_bol.indexOf("\"") + 1, tarih_bol.lastIndexOf("OK"));

mesaj.trim();

durum = "FOLDER:";

durum += klasor;

durum += "|STATUS:";

durum += okundumu;

durum += "|PHONENO:";

durum += telno;

durum += "|DATETIME:";

durum += zaman;

durum += "|MESSAGE:";

durum += mesaj;

}

return durum;

}

Chcę w programie odczytać czy sms przyszedł z właściwego numeru i poznać jego treść.

 Teraz moje pytanie czy dobrze kombinuję.

Czy jeśli "wyciągnę" z biblioteki tą linijkę:

String klasor, okundumu, telno, zaman, mesaj;

i wstawię ją jako zmienne globalne w głównym programie (oczywiście mogę zmienić nazwy tych zmiennych, tylko wtedy w bibliotece też muszę je pozmieniać) to w ten sposób uzyskam wszystkie potrzebne mi informacje tzn. numer telefonu, treść i czas z datą?

Czy dobrze kombinuję czy nie bardzo??

Niestety dalej nie wiem o co chodzi z tym index-em w:

smsRead(uint8_t index) 

??

Link do komentarza
Share on other sites

6 minut temu, SOYER napisał:

Czy dobrze kombinuję czy nie bardzo??

Jak kulawy Icek pod górkę.

Po co masz wyciągać z biblioteki jakieś dumdurumy, jeśli funkcja bardzo ładnie Ci je zwraca wkomponowane w jeden string? Próbowałeś w ogóle przeczytać ten kod czy po prostu skopiowałeś go tutaj, przy okazji skrzętnie usuwając formatowanie żeby było trudniej zgadnąć? Kogo jak kogo, ale Ciebie o takie coś nie podejrzewałem...

Pierwszy raz widzę na oczy tę bibliotekę, nawet nie mam żadnego modułu żeby coś sprawdzić ale rzut oka na funkcję smsRead pozwala mi stwierdzić, że funkcja zwraca string w postaci rekordów oddzielonych znakami '|' w postaci <etykieta>:<wartość> - czyli trzeba sobie po prostu z tego co zwróciła owe rekordy wyciągnąć.

Ja bym nie bawił się w żadne funkcje na String, wziąłbym po prostu c_str(), a potem strtok, strncmp, strchr i takie tam... doczytasz sobie w string.h.

18 minut temu, SOYER napisał:

Niestety dalej nie wiem o co chodzi z tym index-em w:

Hm... wpisanie do googla AT CMGR conieco może wyjaśnić, np. to:

Cytat

index is an integer specifying the location of the SMS message to be read from the message storage area.

Podepnij moduł, naskrob kawałek prostego programu, wyślij do niego sms-a i próbuj przeczytać.

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Widziałem co zwraca ta funkcja, dlatego wymyśliłem co wymyśliłem. 🙂

16 minut temu, ethanak napisał:

c_str(), a potem strtok, strncmp, strchr i takie tam...

nie słyszałem wcześniej, więc się doedukuję... 

 

20 minut temu, ethanak napisał:

AT CMGR

nie wiedziałem,

że to coś ważnego 😉

2 minuty temu, macizet napisał:

To po Swahili? Chodzi mi o jezyk...

turecki:)) 

Link do komentarza
Share on other sites

28 minut temu, SOYER napisał:

Widziałem co zwraca ta funkcja, dlatego wymyśliłem co wymyśliłem. 🙂

Może ja dzisiaj ciężko myślę ale nie bardzo łapię. Widziałeś, że funkcja zwraca wszystko czego potrzebujesz więc zamiast to wykorzystać postanowiłeś przerobić funkcję tak, aby korzystała z jakichś szemranych zmiennych globalnych? w BIBLIOTECE??? <tu powinien być emoticon ale nie znam takiego który przedstawia moją szczękę leżącą na podłodze trzy pietra niżej>

29 minut temu, SOYER napisał:

więc się doedukuję... 

Warto choćby z tego powodu, że jeśli będziesz się bawić w String i podobne pochodne malloca to za chwilę Ci ramu zabraknie.

30 minut temu, SOYER napisał:
51 minut temu, ethanak napisał:

AT CMGR

nie wiedziałem,

że to coś ważnego

Hm... chcesz powiedzieć, że bierzesz się za przerabianie biblioteki operującej na komendach AT nie wiedząc, do czego one służą???

  • Lubię! 1
Link do komentarza
Share on other sites

Bo pytałeś o gryzienie biblioteki, zamiast o to co powinieneś (np. "jak ze stringu o takiej to a takiej postaci wyciągnąć takie to a takie informacje"). Dawno byś wiedział i pewnie miał gotowy program.

Jak mniemam, teraz już wiesz (albo przynajmniej wiesz co zrobić żeby wiedzieć bez zawracania głowy pytaniami o tabliczkę mnożenia)? 🙂

 

Link do komentarza
Share on other sites

1 minutę temu, SOYER napisał:

Prosiłem o pomoc w wykorzystystaniu konkretnych funkcji. 

Tak, zamiast o pomoc w interpretacji wyników. Gdybyś zatytułował ten wątek nieco inaczej (np. podał że chodzi tu o GSM) to bym nawet tu nie zajrzał, bo temat jest mi raczej obcy - podobnie jak i pewnie paru osobom, które C++ znają lepiej ode mnie, stringi parsują na śniadanie, a z modemami GSM nie mają nic wspólnego.

Sztuka zadawania pytań...

4 minuty temu, SOYER napisał:

Dalej nie wiem o co biega z tym indexem, coś mam wpisać w argumentach tej funkcji? 

Prawdopodobnie tak bo funkcja tego wymaga... pewnie trzeba podać co chcesz przeczytać.

Funkcja zaczyna się od wydania komendy CMGR z parametrem, którym jest właśnie ten nieszczęsny index (fajnie że po turecku też się index nazywa). Sprawdź co ten parametr oznacza - tylko może nie w tutorialach do Arduino lecz albo w dokumentacji modułu, albo w spisie komend AT. Tu niestety nie pomogę.

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Pytanie:

Czy nie prościej wyciągnąć dwie zmienne do globalnych i ich użyć wedle potrzeb, zamiast używać tych wszystkich c_str(), a potem strtok, strncmp, strchr i takie tam...?? 

A o tym index poczytam w kontekście tej knkretnej komendy AT. 

Poczytam też  co to te AT komendy... 😉

 

Link do komentarza
Share on other sites

31 minut temu, SOYER napisał:

Czy nie prościej wyciągnąć dwie zmienne do globalnych i ich użyć wedle potrzeb

Nie.

Masz za dużo pamięci w swoim Arduino? Będziesz pamiętał, żeby zwolnić pamięć po wykorzystaniu? Rozumiem, że znasz ograniczenia związane z malloc() na AVR-ach i wiesz, jak uniknąć pułapek? Czy może za jakiś czas będziesz pisał rozpaczliwe posty w stylu "czemu mój program się zawiesza po odebraniu 53 SMS-a?"

Tych takich tamów dzisiaj nie znasz i wydają się bardzo tajemnicze (przypominam, że kiedyś nie wiedziałeś co to automat skończony) - jak poznasz to będziesz wiedział jak te takie tamy zastosować nie tylko przy odbieraniu SMS-a, ale przy fafnastu innych sprawach związanych z przetwarzaniem tekstu. Zmienne globalne zastosujesz raz w jednym programie, biblioteka przestanie być biblioteką (bo będzie wymagała istnienia konkretnych zmiennych globalnych) albo - co gorsze - sama sobie takie zmienne zdeklaruje.

A teraz wyobraź sobie, że Pan Turek odkrył krytyczny błąd w swojej bibliotece, albo w jakiś sposób ja ulepszył... nieważne w sumie co tam zrobił ale coś takiego, że fajnie by było mieć nową wersję... każdy normalny człowiek po prostu ściąga nową wersję biblioteki i przekompilowuje program bez żadnych zmian. Ty będziesz siedział i nogi w balei moczył, bo Pan Turek zupełnie zmieni tę funkcję i takich zmiennych już tam nie będzie...

Poza tym do zwracania wyników funkcji nie służą zmienne globalne. Jest mnóstwo innych prawidłowych sposobów (ze zwracaniem wartości poprzez return na czele).

A zmienne globalne owszem, do wielu rzeczy służą, ale przede wszystkim potrzebne są wtedy, gdy do danej zmiennej musisz dostać się z wielu różnych miejsc programu. Po co jakiejkolwiek funkcji niezwiązanej z uzbrojeniem/rozbrojeniem alarmu wiedza o tych zmiennych?

  

31 minut temu, SOYER napisał:

Poczytam też  co to te AT komendy...


A nie zaszkodzi - bo może się okazać, że biblioteka Pana Turka wcale nie jest najlepszym rozwiązaniem i napisanie tego po swojemu według własnych potrzeb może być dużo lepszym rozwiązaniem.

Edytowano przez ethanak
  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Proponuje stworzyć strukturę opisującą numer, treść, datę itp oraz osobną funkcję która na podstawie zwróconego stringa z funkcji smsRead wypełni wszystkie pola w strukturze. Będzie czysto i przejrzyście. Do cięcia stringa użyj jak radzą wyżej c_str(), a potem strtok, strncmp, strchr.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.