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

Problem z stringami AVR Studio atmega8

Krampek 05 Mar 2009 20:01 1289 2
REKLAMA
  • #1 6241018
    Krampek
    Poziom 16  
    Witam

    Mam problem z nadpisywaniem stringów

    Wysyłam z komputera po rs'ie do procka znak/i i procek odpowiada mi po chwili tym co otrzymał. Czasem zdarza się że procek wysyła więcej niż powinien tzn np. wysyłam kilka znaków - odpowiada OK, następnie wysyłam mniej znaków, a procesor odpowiada tym co wysłałem + część z poprzednio wysłanych znaków.

    Poniżej listing.

    Znaki odbieram w głównej procedurze ( bo mam tam pewną przeróbkę ) która potrzebna jest do nieobecnej reszty programu ).

    int main(void)
    	{
    	int j,i=0;
    	long czas=0;
    	unsigned char wpis[12];
    
    	UART_init();
    
    	while(1)
    		{
    		UART_putstr(" Podaj znak ");
    		czas=0;
    		for(i=0;i<10;i++)
    			{	
      			while(bit_is_clear(_USR_,RXC)&&czas<1000000)
    			  	{
    				if(i!=0)
    					czas++;
    				} 
      
    		 	cbi(_USR_,RXC);
      
    		 	if (czas>990000)
    		  		error=1;
    			else
    		  		{
    				wpis[i]=UDR;
    				error=0;
    				}
    			if (error==1)
    				{
    				break;
    				}
    			}
    
    
    		cbi(PORTC,PC0);
    		for(i=0; i<600; i++)  // opóźnienie
    		for(j=0; j<123; j++); // opóźnienie
    		sbi(PORTC,PC0);
    
    		UART_putstr(" Wysłano: ");
    		UART_putstr(wpis);
    
    		}
    	}


    Problem jest z stringiem wpis ( tablica charów).

    Ktoś ma jakiś pomysł w czym może tkwić mój błąd? Dlaczego string się nie odświeża zawsze ?

    Pozdr.
  • REKLAMA
  • Pomocny post
    #2 6241669
    kaktus_c++
    Poziom 18  
    string powinien kończyć się znakiem NULL czyli o wartości zero. Nie używałem uarta, czy gdzieś w Twoim kodzie jest funkcja / lub ją dodałeś że po odebraniu tylko 5 znaków zostanie dopisany znak NULL? jeśli nie ma tam takiego czegoś to nic dziwnego. Funkcja UART_putstr będzie wypisywać wszystko co napotka aż znajdzie znak NULL (zero).

    najprostsze co możesz to:
    pod wierszem UART_putstr(" Podaj znak ");
    dodaj:
    for(int i=0;i<12;i++)
    wpis[i]=0;

    to chyba powinno wtedy działać ok.

    pzdr.
  • #3 6241801
    Krampek
    Poziom 16  
    Problem wyjaśniony .. faktycznie źle wpisywałem NULL'a ( w tym listingu tego nie ma ) ale wpisywałem go w pozycję wpis[i+1] .. a przecież pętla for sama inkrementuje zmienną i .. i w tym przypadku wypisywało mi znak więcej. Teraz po poprawce jest OK. Sorry za problem.. mogłem jeszcze posiedzieć nad tym i nie zawracać głowy. Pozdr.
REKLAMA