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

[C] Pobieranie stringu przez uart

mystre 31 Sie 2008 20:40 2381 7
  • #1 5494245
    mystre
    Poziom 11  
    Witam

    Czy ta funkcja jest napisana poprawnie?
    void uart_gets(char* Buffer, uint8_t MaxLen)
    {
      uint8_t NextChar;
      uint8_t StringLen = 0;
     
      NextChar = uart_getc_block();         // Warte auf und empfange das nächste Zeichen
     
                                   
      while( NextChar != '\n' && NextChar != '\n' && StringLen < MaxLen - 1 ) {
        *Buffer++ = NextChar;
        StringLen++;
        NextChar = uart_getc_block();
      }
     
      *Buffer = '\0';
    }
    
    uzycie:
    char buffer[10];
    uart_get(buffer,10);
    

    Czasami mi dziala, a czasami nie i nie mam pojecia dlaczego.
    Moze ktos podzieli sie inna funkcja do pobierania stringa?

    Pozdrawiam

    Proszę umieszczać listingi programów w znacznikach "Code". [c_p]
  • #3 5496750
    mystre
    Poziom 11  
    Tak powinno byc "\r".

    Pozniej robie uart_puts(buffor);
    Niektore stringi mi wyswietla na terminalu, a niektorych nie.
    buffor[10] jest z zapasem.
    Probuje pobrac z modulu GSM "RDY" -to sie nie da.
    Musze dac:
    while (uart_getc_block() != '\n');

    W tej samej funkcji w dalszej czesci kodu juz mi normalnie dziala.
    Za cholere nie wiem dlaczego sie tak dzieje.
    Wszedzie daje:
    char buffer[10]; 
    uart_get(buffer,10); 


    Zamiast && nie powinno byc ||?
  • #4 5497248
    acid12
    Poziom 21  
    powinonno być 'or' " || ",

    while( (NextChar != '\n' ) || ( StringLen <( MaxLen - 1) )) {
    ...
    }

    dopóki, nextchar jest różne od '\n', lub, długość jest mniejsza od max -1.

    gdy którekolwiek będzie fałszem (nextchar = koniec lub długośc = max) pętla się skończy

    ps. wiem że dużo nawiasów, ale ja zawsze daję, zmniejszam ryzyko, wole jawnie dać kompilatorowi do zrozumienia które operacje są dla mnie ważniejsze :P
  • #5 5497559
    mystre
    Poziom 11  
    Zmodyfikowalem kod tak:
    void uart_gets(char* Buffer, unsigned char MaxLen)
    {
      char NextChar;
      unsigned char StringLen = 0;
     
      NextChar = uart_getc_block();         // Warte auf und empfange das nächste Zeichen
    
                                      // Sammle solange Zeichen, bis:
                                      // * entweder das String Ende Zeichen kam
                                      // * oder das aufnehmende Array voll ist
    	while( (NextChar != '\n' ) || ( StringLen <( MaxLen - 1) )) {
        *Buffer++ = NextChar;
        StringLen++;
        NextChar = uart_getc_block();
    	uart_putc(NextChar);
      }
                                       // Noch ein '\0' anhängen um einen Standard
       uart_puts("koniec");                               // C-String daraus zu machen
      *Buffer = '\0';
    }


    W funkcji mam tylko:
    char bufor[14];	//bufor na odpowiedź
    uart_gets(bufor,X);	//RDY

    Dla X=3-9 terminal daje:
    RDY
    
    GHOST MODE
    
    +CFUN: 0
    RDY
    
    ERROR
    koniec

    Czyli prawidlowo.
    Ale dla x>9 daje:
    RDY
    
    GHOST MODE
    
    +CFUN: 0
    RDY
    
    ERROR
    GHOST MODE
    p|
    ERROR


    Dlaczego tak sie dzieje? Bufor mam 14.

    Dodano po 51 [minuty]:

    Tak jakby po RDY nie bylo \n, a pozniej trafilo na spacje.
    Moze pomijac spacje?
  • #6 5503518
    mystre
    Poziom 11  
    Z tego co udalo mi sie zauwazyc, to problemem sa opoznienia.
    Modul wysyla dane, zanim procek zatrybi.
    Nalezalo odczekac pewnien czas (np 1 sekunde), a dopiero pozniej rozpoczac komunikacje z modulem.
  • Pomocny post
    #7 5503864
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #8 5503988
    acid12
    Poziom 21  
    racja, mój błąd, powinno byc && zamiast ||.
REKLAMA