[C] Przekazywanie struktury do funkcji
Ostatnio zmodyfikowano 2013-04-04 20:53
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
|
|
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. |
|
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ę: 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: int RS232_PollComport( int comport_number, unsigned char * buf, int size )
Moje wykorzystanie funkcji: RS232_PollComport( 0,( unsigned char * ) rcv_data_ptr, 1 );
Następnie (w tej samej pętli inkrementuję wskaźnik i 1 bajt: *( 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ę? |
|
Monika90 |
» 2013-04-04 20:45:47 Następnie (w tej samej pętli inkrementuję wskaźnik i 1 bajt:
*( 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: unsigned char * byte_data_ptr =( unsigned char * ) & rcv_data;
* byte_data_ptr++;
|
|
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ć :-) |
|
1 « 2 » |