Witam.
Po lekturze tego tematu i ja chciałem coś tu dodać. A oto mój sposób na odbieranie string'ów :
w bibliotece MKUART w pliku mkuart.h pod definicjami (#define...) ,a przed deklaracjami funkcji - dodałem taki wpis:
Kod:
extern volatile uint8_t flag; // TO JEST MOJE !!
w bibliotece MKUART w pliku mkuart.c pod definicjami zmiennych - dodałem taki wpis:
Kod:
volatile uint8_t flag; // TO JEST MOJE !!!
w bibliotece MKUART w pliku mkuart.c w definicji procedury obsługi przerwania odbiorczego ISR( USART_RXC_vect ) tuż za linijką z instrukcją " data = UDR; //pobieramy natychmiast bajt danych z bufora sprzętowego ", a przed linijką z instrukcją " tmp_head = ( UART_RxHead + 1) & UART_RX_BUF_MASK; " - dodałem taki wpis:
Kod:
if(data == '\r') flag++; // TO JEST MOJE !!!
w moim programie w pliku main.c a przed funkcją " int main (void) {...} " - dodałem taki wpis:
Kod:
char tablica[17]; // bufor znakow ASCII z odczytu (taki jest bufor w funkcji "void uart_putint(int value, int radix)" biblioteki mkuart.c)
uint8_t i; // ilość wszystkich znaków odczytanych
char c; // odczytany znak
w moim programie w pliku main.c w funkcji " int main (void) {...} " w pętli głównej " while(1) {...} " - dodałem taki wpis:
Kod:
if(flag) // jeżeli są odebrane dane w buforze to...
{
i =0; // zerowanie licznika i
while ((c = uart_getc()) != '\r') // sprawdza czy koniec string'a (czy jest enter -> 0x0D)
{
if((i <= 17) && (c != '\n')) // uwaga!... max. ilość znaków w string'u to 16
{
tablica[i] =c; // zapis znaku do wybranej komórki w tablicy
i++; // następna komórka w tablicy
tablica[i] ='\0'; // ostatni znak w łańcuchu
}//end if()...
}//end while()...
flag--; // flaga końca odbioru danych z uart
}//end if(flag)...
Chciałbym stworzyć funkcję, gdzie cały łańcuch typu string odebrany z mojego laptopa miałbym w tablicy o nazwie " tablica ", i tu moje pytanie czy taka funkcja napisana poniżej była by poprawna?.
Kod:
#define ROZMIAR 16 // rozmiar odebranych znaków wynika z bufora znaków wysłanych na port szeregowy w funkcji "void uart_putint(int value, int radix)" biblioteki mkuart.c
uint8_t tab[ROZMIAR]; // bufor tekstu
uint8_t tablica[ sizeof(tab) +1 ]; // bufor na tekst plus znak '\0'(znak końca łańcucha)
// procedura pobiera z PC łańcuch typu "String"
void PC_Text(uint8_t *tablica) // ilość znaków w łańcuchu (minimum 1)(maximum 16)
{
char c; // odczytany znak
while ((c = uart_getc()) != '\r') // sprawdza czy koniec string'a (czy jest enter -> 0x0D)
{
if((sizeof(tablica++) <= ROZMIAR) && (c != '\n')) // uwaga!... ta linijka ma pozwolić wpisać do tablicy max. 16 znaków
{
*tablica++ = c; // zapis znaku do wybranej komórki w tablicy
}//end if()...
}//end while()...
*tablica++ ='\0'; // ostatni znak w łańcuchu
}//koniec ---------------------------------------
Wdzięczny będę za każdą uwagę i ewentualne poprawienie mojej funkcji.
Piotr