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
oraz plik uart.c
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;
}