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] Konwersja HEX na INT i wyświetlanie na LCD w AVR - problem z kodem

djkomprez 04 Kwi 2012 23:10 2036 2
REKLAMA
  • #1 10758209
    djkomprez
    Poziom 21  
    Witajcie !

    Szlag mnie trafia już dlatego proszę Was o pomoc ..

    Jak w temacie .. wysyłam hex poprzez port rs232 na uart megi
    tam w postaci char jest przechowywany w tablicy a następnie
    liczony do int-a i wyświetlane jest to na lcd poprzez itoa.

    Niestety nie działa jak należy ... oto kod :

    plik main
    
    int hex2int(int byte) 
    { 
    test = 0; 
    test = strtol(&uart_rx_buffer[byte], NULL, 16); 
    return test; 
    }
    
    
    int main(void){
    char buffer[7];//przykadowo 7
    int  num;
    
     LCD_Initalize();  
      
       UART_init();   			// inicjalizacja portu szeregowego
       sei();  
    
    
    init_ecu();					// odblokowanie przerwań
    LCD_WriteText("TEST");
    char bufor[16];
    int liczba;
    
    
       while(1)
       {
          
          if(uart_rx_complete)  // jeśli odebrano polecenie
          {
    		serial1=hex2int(1);
    		LCD_WriteText(itoa(hex2int(1),buffer,10));
             uart_rx_len = 0;
             uart_rx_complete = 0;
          }
       }
    }
    



    oraz plik uart.c
    
    
    #define USART_BAUDRATE   9600
    #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
    
    // maksymalna liczba znaków polecenia
    #define UART_MAXBUFF 255
    
    // bufor znaków polecenia (UART_MAXBUFF znaków + jeden pod znak zero)
    char uart_rx_buffer[UART_MAXBUFF+1];
    // flaga informująca, czy bufor zawiera całe polecenie
    volatile unsigned char uart_rx_complete;
    // zmienna zawierająca długość polecenia w buforze
    volatile unsigned char uart_rx_len;
    
    // Inicjalizacja uartu
    void UART_init(void)
    {
       UBRRH = (BAUD_PRESCALE >> 8);
       UBRRL = BAUD_PRESCALE;
    
       UCSRA = 0;
       UCSRC = _BV(URSEL)|_BV(UCSZ0)|_BV(UCSZ1);
       UCSRB = _BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
    }
    
    
    void USART_Transmit( unsigned char data )
    {
    
        /* Wait for empty transmit buffer */
        while ( !( UCSRA & (1<<UDRE)) ) ;
        /* Put data into buffer, sends the data */
        UDR = data;
    } 
    
    
    
    // sygnał przyjścia bajtu
    SIGNAL(SIG_UART_RECV)
    {
       char ch = UDR;
       // jeśli ostatnie polecenie nie zostało przetworzone - odrzuć bajt
       if(uart_rx_complete)
          return;
    
       // jeśli przyszedł znak końca  - zakończ odbiór
       if(ch == 0xFF)
       {
          uart_rx_buffer[uart_rx_len] = 0;
          uart_rx_complete = 1;
          return;
       }
       // opcjonalne odrzucanie innych znaków
    // if(ch < 0x20 || ch >= 0x80)
    //    return;
       
       // jeśli bufor pełny - też zakończ odbiór
       if(uart_rx_len == UART_MAXBUFF)
       {
          uart_rx_buffer[UART_MAXBUFF] = 0;
          //uart_rx_complete = 0xFF;
          return;
       }
       
       // można przetworzyć bajt, nie jest to koniec linii i jest miejsce w buforze - dodaj bajt
       uart_rx_buffer[uart_rx_len++] = ch;
    }
    
  • REKLAMA
  • #2 10759303
    korrus666
    Poziom 40  
    Nie wiem co CI się nie zgadza i czy funkcja strtol(&uart_rx_buffer[byte], NULL, 16) zwraca na pewno to co chcesz ale widzę że zawsze wyświetlasz bajt o indeksie 1 z tablicy
    LCD_WriteText(itoa(hex2int(1),buffer,10));
    Wyświetl ten bajt w takiej postaci jak przychodzi z UART i zobacz czy tam jest na pewno to co chcesz.
  • #3 10760958
    djkomprez
    Poziom 21  
    Właśnie jest chyba problem ... bo z tego co widzę to używam Realterma, wysyłając nim
    0x40 ... nic nemo .... ale jak już wyślę $40 (wg opisu w pomocy "jako hex") to już cos pokazuje ... ale zawsze "0" cokolwiek nie wyślę.

    Kolejny test :

    - wysyłam na uart znak przerobiony poprzez hex2int efekty :
    $40 $50 $30 = 04 00 00 (wyslano - odebrano)
REKLAMA