logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

AVR + c35 wysyłanie smsa. Błąd w kodzie?

r06ert 15 Paź 2008 17:20 2855 4
REKLAMA
  • #1 5634525
    r06ert
    Poziom 25  
    Witam kolegów, mam problem, wzorując się na programach ściągniętych z sieci napisałem własny program do wysyłania smsa z C35. Telefon niestety nie chce nic wysyłać... Sprawdzałem w terminalu co wysyła mikroporcek i wszystko wydaje się być ok.
    Na komendy AT telefon oczywiście reaguje poprawnie.

    proszę o pomoc kolegów, z góry dzięki
    pozdrawiam.
    Cytat:

    prog_char dlugoscSCA = {0x07}; //dlugosc numeru SCA +1
    prog_char typSCA = {0x91}; //typ numeru centrum obslugi
    unsigned char numerSCA[6]; //zakodowany numeru centrum obslugi, zapisywany przez funkcje numerSCA

    prog_char pierwszyOktet = {0x11};
    prog_char numerOdniesienia = {0x00};

    prog_char dlugoscNumeruOdbiorcy = {0x09};
    prog_char typNumeruOdbiorcy = {0x81};
    unsigned char numerOdbiorcy [5];

    prog_char identyfikatorProtokolu = {0x00};
    prog_char schematKodowania = {0x00};

    prog_char okresWaznosci = {0x8F};

    [...]

    //wysłanie wiadomości SMS
    void sendsms( char *tekst)
    {
    char len, i, n, ch_1, ch_2;

    n = len = strlen(tekst); //obliczenie długości łańcucha znaków
    i = n / 8; //licząc od “pierwszego oktetu”
    n = i * 7 + i % 8 + 13;

    WyslijStrNaUART("AT+CMGS=");
    WyslijStrNaUART("20"); //tymczasowo!!!!!!!!!!!!!
    TransmitUSART(0x0D);

    while(ReceiveUSART() != '>'); //oczekiwanie na znak “zachęty”

    TransmitUSART(pgm_read_byte(&dlugoscSCA));
    TransmitUSART(pgm_read_byte(&typSCA));
    unsigned char numerekSCA[] = {0x84, 0x06, 0x92, 0x15, 0x11, 0xF1};
    WyslijHexNaUART (numerekSCA,6); //wysyła 6 bajtow z tablicy numerekSCA

    TransmitUSART(pgm_read_byte(&pierwszyOktet));
    TransmitUSART(pgm_read_byte(&numerOdniesienia));
    TransmitUSART(pgm_read_byte(&dlugoscNumeruOdbiorcy));
    TransmitUSART(pgm_read_byte(&typNumeruOdbiorcy));

    unsigned char mojnr[] = {0x96, 0x00, 0x00, 0x00, 0xF0};
    WyslijHexNaUART(mojnr, 5); //wysyla 5 bajtow z numerem tel

    TransmitUSART(pgm_read_byte(&identyfikatorProtokolu));
    TransmitUSART(pgm_read_byte(&schematKodowania));
    TransmitUSART(pgm_read_byte(&okresWaznosci));

    TransmitUSART(len);

    i = 0;
    while (i < len)
    {
    ch_1 = *(tekst + i); //pobranie pierwszego znaku tekstu
    ch_2 = *(tekst + i + 1); //pobranie następującego za nim znaku
    n = i % 8; //obliczenie ilości przesunięć
    ch_1 >>= n; //przesunięcie pierwszego znaku w prawo
    n = 7-n; //wyliczenie liczby przesunięć dla //2-go znaku
    ch_2 <<= n; //przesunięcie drugiego znaku w lewo
    ch_1 += ch_2;
    TransmitUSART(ch_1); //wyliczenie kodu nowo powstałego znaku
    //printf(“%02X”, ch_1); //wysłania znaku szesnastkowego
    i++; //następna pozycja w łańcuchu
    if (n == 1) i++; //dla każdego 8-go znaku przesunięcie //o 1, znak jest “gubiony”
    }

    TransmitUSART(0x06);
    TransmitUSART(0x1A);
    TransmitUSART(0x0D);
    }


    int main(void){
    unsigned long int bauda = 19200;
    InitUSART(bauda);

    sendsms("WITAJ!");
    return 0;
    }
  • REKLAMA
  • #2 5635119
    wojnar
    Poziom 17  
    Może być też błąd po stronie telefonu albo samego Siemensa.
    Gdzieś też dotarłem się do AT komend i żeby tylko sprawdzić czy działają to podpiąłem mego ME75 i wykręcić numer szło, odebrać też, ale SMS nie odesłałem :-(
    Chcę tym powiedzieć, że program może być w porządku i wysyłane komendy też, tylko SIEMENS może trochę nie standardowo zastosował AT komendy i trzeba szukać tu.
  • REKLAMA
  • #3 5635506
    r06ert
    Poziom 25  
    wojnar napisał:
    wykręcić numer szło, odebrać też, ale SMS nie odesłałem

    jakbyś mi to z ust wyjął :|
  • REKLAMA
  • #4 5636413
    zumek
    Poziom 39  
    Nie analizowałem Twojego kodu dokładnie , ale co rzuciło mi sie w oczy.
    Po wysłaniu "AT+CMGS=20" , czekasz tylko na odesłanie znaku zachęty ">" i zaraz po tym wysyłasz PDU , a telefon jeszcze po ">" wysyła 1 spację.
    U mnie tak to wygląda:
    
    	while(getchar()!='>');     //oczekiwanie na znak zachęty ...
    	getchar();                 //... i spację
    
    //...wysyłam PDU
    
    	delay_ms(1000);       // bez opóźnienia , nie zawsze mi działało                        
    
       putchar(0x1A);		//bez "\r\n"						
    

    Poza tym , każde(za wyjątkiem 0x1A) polecenie wysyłane do telefonu , kończę "\r\n" (0x0D,0x0A) , bo tak jest skonfigurowany domyślnie , terminal w C35i.

    Piotrek
  • #5 5657060
    r06ert
    Poziom 25  
    Witam! Wczesniej bład robiłem w tym że nie wysyłamem stringów tylko znaki hex...

    Korzystając z wolnego dnia wróciłem do grzebania ;)
    robię tak jak kolega zumek mówi. Po wysłaniu AT+CMGS czekam na znak zachęty wysyłam PDU a na koniec znak 0x1A ale telefon zwraca mi ERROR
REKLAMA