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

[Mega16] [C] Problem z odbiorem "string'a" przez U

JmL(TM) 14 Cze 2008 17:35 1863 6
REKLAMA
  • #1 5245943
    JmL(TM)
    Poziom 24  
    Witam!

    Od wczoraj siedze nad tym kodem i nie moge odebrac string'a w "calosci". Wysylanie pojedynczych znakow oraz calych tekstow dziala prawidlowo jak rowniez odbior pojedynczych znakow. Jednakze jak probuje odebrac string - nic z tego.

    Ponizej zamieszczam kod:

    #include <avr/io.h>
    #include <stdlib.h>
    #include <util/delay.h>
    
    typedef unsigned char  u08;
    
    #define USART_BAUDRATE	57600
    #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
    
    #define	UART_MAX_GETSTR	100
    
    #define	BIN				 2
    #define	OCT				 8
    #define	DEC				10
    #define	HEX				16
    //*========================================================*//
    
    void UART_init(void) {
    	UCSRB |= (1 << RXEN) | (1 << TXEN);
    	UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
    
    	UBRRL = BAUD_PRESCALE;
    	UBRRH = (BAUD_PRESCALE >> 8);
    }
    //*========================================================*//
    
    void UART_put_char(char c)
    {
    	while ((UCSRA & (1 << UDRE)) == 0) {}
    
    	UDR = c;
    }
    //*========================================================*//
    
    void UART_put_str (char *s)
    {
    	register u08 c;
    
    	while ((c = *s++))
    	{
    		UART_put_char(c);
    	}
    }
    //*========================================================*//
    
    void UART_put_str_new_line(void)
    {
    	UART_put_char(0x0D);
    	UART_put_char(0x0A);
    }
    //*========================================================*//
    
    void UART_put_int(int value, u08 radix)
    {
    	char string[17];
    
    	itoa(value, string, radix);
    	UART_put_str(string);
    }
    //*========================================================*//
    
    char UART_get_char(void)
    {
    	while ((UCSRA & (1 << RXC)) == 0) {}
    
    	return UDR;
    }
    //*========================================================*//
    
    void UART_get_str(char *s)
    {
    	uint8_t i = 0;
    	uint8_t ch = 0;
    
    	do
    	{
    		ch = UART_get_char();
    		s[i] = ch;
    
    		i++;
    	} while ((ch != 10) && (ch != 13) && (i <= UART_MAX_GETSTR));
    
    	s[i - 1] = 0;
    }
    //*========================================================*//
    
    int main (void)
    {
    	char	ReceivedString[100];
    
    	UART_init();
    
    	for (;;)
    	{
    		UART_get_str(ReceivedString);
    
    		UART_put_str_new_line();
    		UART_put_str_new_line();
    
    		UART_put_str(ReceivedString);
    
    		_delay_ms(5000);
    	}    
    }
    //*========================================================*//


    Czy ktokolwiek widzi blad?
  • REKLAMA
  • REKLAMA
  • #3 5246121
    JmL(TM)
    Poziom 24  
    Zmodyfikowalem ten fragment:

    void UART_get_str(char *s)
    {
    	uint8_t i = 0;
    	uint8_t ch = 0;
    
    	do
    	{
    		ch = UART_get_char();
    		s[i] = ch;
    
    		i++;
    	} while ((ch != 10) && (ch != 13) && (ch != '!') && (i <= UART_MAX_GETSTR));
    
    	s[i - 1] = 0;
    }


    Dodalem "&& (ch != '!')" i jak wysylam np. "test!" to dostaje odpowiedz w terminalu ale jak wysylam kolejny raz to samo juz nie dziala... Jesli natomiast zmienie wysylany tekst na jakis inny i zakoncze go ponownie "!" znow dostaje odpowiedz... ale tylko jeden raz :|
  • REKLAMA
  • Pomocny post
    #4 5246148
    Freddie Chopin
    Specjalista - Mikrokontrolery
    po pierwsze w terminalu musisz ustawic zakanczanie wysylanej wiadomosci znakiem konca, bo wcale nie kazdy terminal to daje (moj np nie [; ) dlatego prosciej stringa zakanczac jakims znaczkiem, np wykrzyknikiem.

    co do tego, ze program nie dziala z tym samym komunikatem ponownie, to... nie mam pojecia [;

    4\/3!!
  • #5 5246253
    JmL(TM)
    Poziom 24  
    Akurat w tym, ktorego ja uzywam jest opcja zakonczenia wysylanego ciagu znakow. Jednakze zapobiegawczo dodalem konczenie znakiem "!" i odziwo dziala, jednak wciaz nie rozumiem dlaczego tylko jednokrotnie a pozniej... nic! :| Dopiero jak zmienie "string" to ponownie zaczyna dzialac.

    Ponizej zamieszczam zrzut ekranu z terminalem:

    [Mega16] [C] Problem z odbiorem "string'a" przez U
  • REKLAMA
  • Pomocny post
    #6 5246283
    Freddie Chopin
    Specjalista - Mikrokontrolery
    mam ten sam terminal [; opcja ktora zaznaczyles pozwala jedynie na konwersje pojedynczego znaku CR na zestaw CR oraz LF, ale jedynie Z PLIKU. przekonaj sie sam - zewrzyj linie 2 i 3 w kablu i napisz cos - zobacz co otrzymasz - zadnego znaku CR ani LF tam nie ma.

    opcja ta jest przydatna przy plikach z innego systemu operacyjnego, ktore maja troche inna filozofie zakonczenia linii. czy cos takiego [;

    4\/3!!
  • #7 5246309
    JmL(TM)
    Poziom 24  
    To mnie zaskoczyles! Dzieki za informacje poniewaz bylem swiecie przekonany, iż tyczy się to rowniez ciagu znakow wysylanych z EditBox'a a nie tylko przesylanych z pliku.

    Program juz dziala!
    Powod: dokladnie jak pisal Freddie Chopin - Terminal nie wysylal znakow CR+LF, a ja bylem przekonany, ze wysyla... i choc zmienilem by konczenie ciagu odbywalo sie poprzez znak "!" to opoznienie na koncu petli bylo moim utrapieniem. Usunalem:
    
    _delay_ms(5000);


    i teraz z terminala wysylam przykladowo ciag "test$0d$0a" i wszystko dziala!

    Podziekowania dla Freddie Chopin'a za pomoc!
    Temat zamykam!
REKLAMA