Czołem,
od wczoraj męczę się z transmisją po rs232. Korzystam z kodu z niebieskiej płytki.
Otóż jest tam bufor, który jest uzupełniany za każdym razem kiedy coś pojawi się w UDR i tym samym wywoła przerwanie.
Problemem jest dla mnie ściąganie tych danych z bufora w mainie.
Mam taką pętlę:
Kod:
while(1)
{
do
{i++;
bajty[i-1]=uart_getc();
}while(bajty[i-1]!=0);
i=0;
LCD_GoTo(0,1);
LCD_WriteText(bajty);
uart_puts(bajty);
}
I niestety nie działa to poprawnie. Po analizie doszedłem nawet dlaczego(chyba:D). Otóż kolejne bajty wpadają do UDR dość powoli bo co około 1ms(wartość obliczona na jakiejś innej stronce, więc nie wiem czy to prawda...), a pętla zaiwania dużo szybciej. Przez to kiedy wpada pierwszy bajt, pętla do...while przelatuje i się kończy zanim wpadnie drugi. Potem ten jeden jest wyświetlany i znów wpada kolejny bajt(może nawet po kilku obiegach głównego while) i tak w kółko. Przez to tablica bajty jest cały czas nadpisywana i na wyświetlaczu mam tylko ostatni znak tego co wysyłam z terminala.
Rozwiązuje to dodatnie delaya do pętli np:
Kod:
while(1)
{
do
{i++;
_delay_ms(3);
bajty[i-1]=uart_getc();
}while(bajty[i-1]!=0);
i=0;
LCD_GoTo(0,1);
LCD_WriteText(bajty);
uart_puts(bajty);
}
Ale wydaje mi się że nie tędy droga. Może ktoś mnie naprowadzić na właściwą trasę?
Może by jakąś flagę ustawiać kiedy cała wiadomość jest już w buforze i dopiero wtedy ją pobierać z bufora?
No kurcze nie mogę wpaść na pomysł jak to rozwiązać...