Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[ATmega32][Bascom]Odbieranie\odczytywanie SMS z Siemensa C35

bartas87poz 31 Paź 2011 20:11 2551 6
  • #1 31 Paź 2011 20:11
    bartas87poz
    Poziom 9  

    Witam

    Zbudowałem układ oparty o uC ATmega32 i połączyłem ją z Siemensa C35.
    Nie będę opisywał połączenia i wrzucał schematów bo to mi działa.

    Udało mi się odczytać z komórki:
    *Stan naładowania baterii
    *Siłę sygnału antenowego
    *Date i godzinę
    *Numer osoby dzwoniącej
    i zawiesiłem się na odczycie SMS-a.

    Wykrywam nowego sms-a poprzez zapytanie:
    Nowysms = Instr(uart_txt , "CMTI")
    Wyświetla mi się:
    +CMTI: "SM",1

    i chce odczytać go poprzez:
    Print "AT+CMGR=1" ; Chr(13)
    Wait 8
    Gosub Odczytaj_uart
    Cls
    Lcd Uart_txt

    Wyświetla mi się:
    +CMGR: 0,,24 0791

    Według instrukcji powinno być:
    +CMGR: <stat>,[<alpha>],<length><CR><LF><pdu>
    gdzie stat = 0
    length = 24 czyli wielkość sms-a
    a gdzie PDU?

    Kod programu:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Instrukcja do kodów AT: Link

    0 6
  • #2 31 Paź 2011 21:30
    xury
    Poziom 38  

    Gdzie PDU ?
    Przyjrzyj się ramce jeszcze raz:

    Code:
    +CMGR: <stat>,[<alpha>],<length><CR><LF><pdu>


    Ano w następnej linijce, bo masz zwracane <CR><LF>
    Ponadto nie filtrujesz znaków <LF> co może ci nieco namieszać.
    Proponuję odbierać przy pomocy Input i bytematch tak jak ja to zrobiłem w moim projekcie, który pewnie widziałeś.

    0
  • #3 31 Paź 2011 21:40
    bartas87poz
    Poziom 9  

    Teraz zgupiałem ... jak ją odczytać?
    Nie wystarczy wywołać jeszcze raz Gosub Odczytaj_uart

    W części programu -> Odczytaj_sprzetowy_uart
    Funkcje Do kończe jeśli Loop Until Bufor = 0 Or Kod = "13"
    czyli jeśli wystąpi znak CR lub brak znaku, to może być powodem?

    0
  • #4 31 Paź 2011 21:50
    xury
    Poziom 38  

    Skoro stosujesz bufor i czytasz całe linijki to nie ma sensu czytać znak po znaku.
    Czytaj całą linijkę za pomocą Input, i nie bój się, że program Ci zawiśnie, bo wykorzystując Bytematch=13 już wiesz że masz linijkę w buforze więc czytaj linijkę dopiero wtedy kiedy ona tam jest.
    A co do pytania to tak. Pierwsza linijka to dane o długości PDU, a druga to już właściwe PDU
    Potem też powinno być CRLF, napis OK i kolejne CRLF.

    Acha i filtruj znaki LF, lub ustaw Config input

    0
  • #5 01 Lis 2011 13:44
    bartas87poz
    Poziom 9  

    Spróbowałem coś takiego zrobić ale niestety nie działało.
    Nie każda linijka kończyła się znakiem <CR> i wtedy program się zawieszał.

    Znalazłem rozwiązania kolegi "zumek"

    Code:
    Config Serialin = Buffered , Size = 80 , Bytematch = 13
    
    ...
    Serial0charmatch:       'po odebraniu znaku Chr(13) zwiększenie licznika lini(zdarzeń)
    lds r24,{event}
    inc r24
    sts {event},r24
    ret


    i zastosowania funkcji pobierania jednej linii:

    Code:
    Function Getline() 
    
    Linia = ""
    If Event > 0 Then
       Cli       ' lub Disable Urxc:
       Decr Event
       sei       ' lub Enable Urxc
       If _rs_bufcountr0 > 0 Then Input Linia , Noecho
       Err = 0
    End If
    Getline = Len(linia)      'przeniosłe na prawidłowa pozycję ;)
    End Function


    niestety łączy on na tyle płynnie asemblera z baskomem, że niestety trochę się gubię w tym całym kodzie.

    Próbowałem samemu poprzez funkcje Input w chwili zadziałania funkcji Serial0charmatch pobrać linie, ale program zapętlał się (nie zawsze) i czekał cały czas na znak <CR>.

    Ostatnim moim pomysłem wczoraj koło 3 było po prostu wyrzucenie ograniczenia Kod = "13" podczas z czytywania znak po znaku. Zwiększyłem bufor maksymalnie do 254 bajtów i zmieniłem funkcje na:

    Code:
    Odczytaj_uart:
    
      Bufor = Ischarwaiting()                                   'Sprawdz czy bufor pełny
      If Bufor = 1 Then Gosub Odczytaj_sprzetowy_uart
    Return
    Odczytaj_sprzetowy_uart:
       Uart_txt = ""
       Ograniczenie = 0
       Do
         Incr Ograniczenie
         Kod = Inkey()                                          'Odbierz znak po znaku
         Uart_txt = Uart_txt + Chr(kod)                         'Zapisz w Uart_txt
         Bufor = Ischarwaiting()
       Loop Until Bufor = 0 Or Ograniczenie = 250               'Zakoncz kiedy opruzni sie bufor
    Return


    Przez co ograniczyłem się do pobrania sms-a w zapisie PDU do 250 znaków ale pobieram wszystko w jednym stringu. Łącznie ze znakami <CR><LF> - jest to może pójście na łatwiznę ale do krótkich kodów sms-owych raczej się nada.
    Chyba że źle myślę?

    0
  • #6 09 Lis 2011 20:28
    WOBI
    Poziom 19  

    Ja używam innej konfiguracji portu bo też miałem problem i wszystko zadziałało

    Code:


     Config Serialin = Buffered , Size = 100 , Bytematch = 10   ' bo telefon odpowiada 0D0A = 13 10 = ClLf
      Echo Off
        Config Input = Crlf , Echo = Crlf
     


    bytematch = 13 (0Dhex) nie jest dobrym pomysłem bo końcowy znak to 10 (0Ahex), spróbuj tak jak wyżej. Ważna jest też config input i Echo oba maja byc Crlf , nie widzę tego w kodzie u Ciebie.
    Ta funkcja ładnie wycina właśnie 13hex i 10hex z odebranego tekstu z bufora.

    0
  • #7 04 Sty 2012 10:08
    bartas87poz
    Poziom 9  

    OK, udało mi się dojść do ładu z wysłaniem i odbieraniem sms-ów.
    I już myślałem że będzie wszystko ok, pojawił się problem z ładowaniem.

    Podłączyłem się pod wejście od ładowarki przez przekaźnik i chciałem uruchomić ładowanie przy słaby stanie baterii.
    Po włączeniu telefonu i przeprowadzeniu inicjalizacji:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    Przy załączeniu ładowania komórka nie reaguje, mimo obecności 5V nie pobiera w ogóle prądu, ani nie zmienia się stan baterii.

    Przy wyłączeniu i włączeniu telefonu, komunikacja przestaje działać. Nie przeprowadzam inicjalizacji i załączam ładowanie to wszystko OK, ładuje. Wyłączę przestaje ładować, załączę ... ładuje. Po przeprowadzeniu inicjalizacji i uruchomieniu komunikacji już nie działa.

    Jak Wy ładowaliście te komórki? Tak żeby cały układ, cały czas pracował?

    0
TME logo Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME
TME Logo