Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Przekazywanie struktury do funkcji

Ostatnio zmodyfikowano 2013-04-04 20:53
Autor Wiadomość
mkot
Temat założony przez niniejszego użytkownika
» 2013-04-04 14:31:52
Cozatem zrobić aby funkcja odbierala również zera. Przecież z czterech bajtow które zajmuje zmianna int czasami niektóre będą zerami
P-79914
Monika90
» 2013-04-04 15:21:21
Jaki jest system operacyjny na PC?

Jaką wartość zwraca funkcja
RS232_PollComport( 0, tab, 12 );
?
Jej nazwa zawiera słowo poll, co sugeruje, że jest to nieblokujacy odczyt. Odczyta ona bajt bądź dwa i wraca, pomimo że chciałeś by odczytała 12 bajtów. Musisz ją wywoływać w pętli.
P-79921
mkot
Temat założony przez niniejszego użytkownika
» 2013-04-04 20:34:23
Bardzo dziękuję za podpowiedzi, szczególnie Monice90.
Posunąłem się już kilka kroczków dalej w moim programie, odczytałem wszystkie dane na PC w pętli, tak jak sugerowałaś.
Chciałbym je teraz umieścić w strukturze.
Tworzę zatem wskaźnik na strukturę:
C/C++
struct rs232_data rcv_data;
rs232_data * rcv_data_ptr;
rcv_data_ptr = & rcv_data;
Jednak funkcja odczytu oczekuje wskaźnika typu unsigned char, a więc wykonuje rzutowanie:
Definicja funkcji:
C/C++
int RS232_PollComport( int comport_number, unsigned char * buf, int size )
Moje wykorzystanie funkcji:
C/C++
RS232_PollComport( 0,( unsigned char * ) rcv_data_ptr, 1 );
Następnie (w tej samej pętli inkrementuję wskaźnik i 1 bajt:
C/C++
*( unsigned char * ) rcv_data_ptr++;
Teoretycznie powinienem w ten sposób wypełnić strukturę bajt, po bajcie. Oczywiście pętlę wywołuję 12 razy, czyli tyle ile jest bajtów w strukturze - na razie na sztywno.
Efekt jest taki, że w strukturze zapisywany jest tylko pierwszy bajt, reszta jest zerami.
Próbowałem w ten sam sposób zapisywać do tablicy i otrzymałem wszystkie dane, których oczekiwałem.

Podejrzewam zatem, że problem może tkwić w inkrementacji wskaźnika. Czy, aby na pewno dobrze to robię?
P-79952
Monika90
» 2013-04-04 20:45:47
Następnie (w tej samej pętli inkrementuję wskaźnik i 1 bajt:
C/C++
*( unsigned char * ) rcv_data_ptr++;

To inkrementuje nie o 1 bajt, ale o rozmiar całej struktury, ponieważ operator ++ ma wyższy priorytet niż rzutowanie. Utwórz pomocniczy wskaźnik:
C/C++
unsigned char * byte_data_ptr =( unsigned char * ) & rcv_data;

* byte_data_ptr++;
P-79954
mkot
Temat założony przez niniejszego użytkownika
» 2013-04-04 20:53:10
BARDZO dziękuję.
O to mi właśnie chodziło, wszystko działa cacy :-)
Teraz jak to napisałaś to przypomina mi się sprawa priorytetów różnych operacji.
Zbyt rzadko tego używam i dlatego zapominam - czas to zmienić :-)
P-79955
1 « 2 »
Poprzednia strona Strona 2 z 2