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-gcc] rozłożenie długiego stringu na zmienne

gothye 17 Wrz 2009 18:36 2735 6
REKLAMA
  • #1 7028690
    gothye
    Poziom 33  
    witam
    mam problem z którym dość długo się juz męcze bezskutecznie :(
    odbieram sms z telefonu simens który wygląda tak:

    +CMGR: "REC READ","+48xxxxxxxxx",,"09/09/14,12:33:57+08"        
    tresc sms


    odbieram go w przerwaniach :

    
    SIGNAL (SIG_UART_RECV) 
    {
    	znak = UDR ;
    
    	if(znak == 0x0d || znak == 0x0A )
    	{
    		count = 0 ;
    		buffor_rx = 1 ;
    	}else{
    		if(count > 34 ) count = 34 ;
    		buffor[count] = znak ;
    		++count;
    	}
    }
    
    volatile char timeout = 10 ;
    
    SIGNAL(SIG_OVERFLOW1)
    {
    	// TIMER oczekiwania na moduł
    	if(timeout > 0)
    	{
    		--timeout;
    	}
    }
    
    
    void sms_read(unsigned char numer)
    {
    	
    	char sms_ok = 0 ;
    	send_str("AT+CMGR=");
    	send_byte(48+numer);
    	send_byte(0x0D);
    
    	while(timeout)
    	{
    		if(buffor_rx == 1)		
    		{
    			if(strncmp(buffor,"tresc sms",9) == 0 )
    			{
    				buffor_rx = 0 ;
    				sms_ok = 1; 
    			}else{
    				buffor_rx = 0 ;
    				sms_ok = 0 ;
    				timeout = 0 ;
    			}
    		}
    		
    		if(sms_ok == 1 && buffor_rx == 1)
    		{
    			if(strncmp(buffor,"+CMGR",5) == 0 )
    			{
    				PORTA |= (1<<PA1);	// zapal led
    				timeout = 0 ;		
    			}	
    		}
    
    	}
    }
    

    ale nijak to idze działać prawidłowo :(
    Jak najlepiej podzielić tak długi string (tablice char) aby "wyłuskać" numer telefonu oraz treść :?:
  • REKLAMA
  • #2 7028868
    Krauser
    Poziom 26  
    strcmp przegląda string od początku dlatego porównanie z "tresc sms" nie zadziała. Żeby rozdzielić string trzeba wyszukać charakterystyczne znaki funkcją strchr() lub po prostu przeglądać całą tablice i po natrafieniu np. na + zapisać 11 znaków do innej tablicy.
  • REKLAMA
  • #3 7028871
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Pozatym co powyżej - jak chcesz żeby to działało, skoro nie ma prawa?

    Najpierw:

    if(strncmp(buffor,"tresc sms",9) == 0 )
    {
    buffor_rx = 0 ;
    sms_ok = 1;
    }

    a potem:

    if(sms_ok == 1 && buffor_rx == 1)

    No i jakim cudem chcesz żeby to działało, skoro flagę bufora ustawiłeś na 0?

    Pozatym co to jest "buffor" <: ? Ponglisz? [; Coś jak czarakter i intidżer? <:

    4\/3!!
  • REKLAMA
  • #4 7028930
    gothye
    Poziom 33  
    buffor_rx to zmienna :

    volatile char buffor_rx która zmienia stan w przerwaniach UART ,poniewaz tel. przy wysyłaniu sms przez port rs232 ,dzieli go na dwa stringi ,a w przerwaniach odczytuje stringi zakonczone znakiem 0x0D
  • #5 7030064
    Dr.Vee
    VIP Zasłużony dla elektroda
    if (found_newline)
    {
        if (strcnmp(buffer, "+CMGR:", 6) == 0)
        {
            // pierwszy wiersz
        }
        else
        {
            // drugi i kolejne wiersze
            if (strcnmp(buffer, "tresc sms", 9) == 0)
            {
                // dopasowanie treści smsa
            }
        }
    }


    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #6 7030691
    gothye
    Poziom 33  
    dzieki ale nie działa :(
  • #7 7032351
    Krauser
    Poziom 26  
    Pytanie co nie działa. Podpinałeś telefon pod program terminala RS w PC ? SMS nie jest kodowany? Kod Dr.Vee jest bardziej czytelny, a w Twoim wydaje mi się, że najpierw czytasz treść, a później preambułę wiadomości i czy przypadkiem buffer nie jest nadpisywany? Możesz jeszcze spróbować gotowca z Moduły GSM w systemach mikroprocesorowych
REKLAMA