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

Odbieranie string UART. Docklight, LCD, PC, ATmega.

arikadiusz 30 Lip 2009 21:21 5067 5
  • #1 6840285
    arikadiusz
    Poziom 12  
    Witam, zabralem sie za komunikacje USART miedzy PC a atmega. Znalazlem juz jak napisac wysylanie i odbieranie pojedynczego znaku oraz wysylanie stringu, ale nigdzie nie moge znalezc jak odebrac stringa np. wysylam przez Docklight "jakies zdanie" i wysylam to na LCD. funkcje jakie mam:
    
    void nadajznak(char dana1) //wyślij znak
    {
    while(!(UCSR1A&(1<<UDRE1))); //czekaj na wysłanie poprzedniej danej
    UDR1=dana1;
    }
    unsigned char odbierz(void) //odbierz znak
    {
    while(!(UCSR1A&(1<<RXC1)));
    return UDR1;
    }
    
    void odbierzstring(void)    //odbierz string -nie dziala :/
    {
    	char *buf;
    	*buf++=odbierz();
    	return buf;
    }
    
    void wyslijstring( char *text )  //wyświetl napis
    {
    while(*text)
    nadajznak(*text++);
    } 

    Z gory dziekuje za odpowiedzi.
  • Pomocny post
    #2 6840403
    gothye
    Poziom 33  
    odbieraj znak po znaku z UARTu i umieszczaj go np. w tablicy
  • Pomocny post
    #3 6840417
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Nie dziwne że twoja funkja nie działa, skoro odbierasz w niej JEDEN (słownie: 1) znak... stringi kończą się zwykle znakiem \n, czaem nawet kombinacją \r\n

    4\/3!!
  • #4 6841243
    arikadiusz
    Poziom 12  
    Pewnie wynika to z mojej niewiedzy na temat C, dlatego wole zapytac... dlaczego taki kod w main() nie dziala:

    
    char buf[10];
    int i;
    i=0;
    while(!(UCSR1A&(1<<RXC1)));
    	while(UCSR1A&(1<<RXC1)){
    		buf[i]=itoa(UDR1);
    		i++;
    		};
    
    wyslijstring(buf);
    


    Najpierw petla czekajaca na pojawienie sie znaku. Potem petla ktora "rozklada" slowo na czesci i kazda z nich zapisuje do tablicy jako asci. nastepnie wydruk. Na ekranie dostaje tylko smieci :/
  • #5 6841363
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Do itoa() podajesz JEDEN (słownie: 1) parametr, a itoa oczekuje DWÓCH (czasem trzech, zależy od implementacji) - wartości i adresu bufora na znaki (i czasem "podstawy"). Wystarczy czytać ostrzeżenia kompilatora... Nawet nie wiem zresztą czy to Ci się w ogóle skompilowało, wątpie. Ostrzeżenia nie są po to, żeby kogoś zabawić, w 99% przypadków KAŻDE ostrzeżenie to błąd. Inaczej mówiąc - 99% programów da się napisać tak, aby nie było żadnego ostrzeżenia.

    http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/

    Nawet jeśli poprawisz parametry do itoa() to wciąż nie ma prawa działać, bo jest bezsensu. Po co konwertować znak na jego postać "liczbową"? Całośc wykona Ci się tylko i wyłącznie raz (no może jakimś cudem jak komunikacja będzie szybka, a funkcje wolne to kilka).

    4\/3!!
  • #6 6845587
    lnl
    Poziom 12  
    Po pierwsze Twoja funkcja: void odbierzstring(void) nie zwraca parametrów (wskazuje na to słowo void przed funkcją) a Ty mimo wszystko dałeś na koniec return...

    Twoja funkcja musi zawierać pętle, która odbiera znak za znakiem do momentu pojawienia się znaku końca '\n' tak jak napisał Ci kolega Freddie Chopin.

    Czyli cos takiego:

    
    unsigned char bufor[32]; // zmienna globalna
    
    void odbierzstring(void)
    {
    unsigned char i=0;
    
    do
    {
    
    if ((bufor[i] = odbierz()) == '\n') break; //dodaje odebrane znaki do tablicy, jesli odbierze '\n' to przerywa petle i wychodzi z funkcji
    
    i++;
    
    }while (i < 32); // zeby nie przepelnic bufora
    
    }
    
    
    
REKLAMA