[C] Przekazywanie struktury do funkcji
Ostatnio zmodyfikowano 2013-04-04 20:53
mkot Temat założony przez niniejszego użytkownika |
[C] Przekazywanie struktury do funkcji » 2013-04-03 22:12:18 Witam, Głowię się od jakiegoś czasu jak rozwiązać następujący problem. Piszę program na procesor STM32F4, który miałby po RS232 wysyłać dane zawarte w strukturze: struct rs232_data { int a; int b; int c; };
struct rs232_data dane;
dane.a = 12; dane.b = 34; dane.c = 76; Póki co to przykładowa struktura, która ma na celu wyłącznie przetestowanie idei, która powstała w mojej głowie. Docelowa struktura będzie o wiele większa i będzie zawierała różne typy danych. Pytanie brzmi jak przekazać tę strukturę do funkcji, która ma wysłać jej zawartość bajt po bajcie. Funkcja, którą mam przetestowaną na tablicach wygląda następująco: void USART_send( uint8_t data[], uint16_t len ) { int i = 0; for( i = 0; i < len; i++ ) { USART1->DR = data[ i ]; while( !( USART1->SR & USART_SR_TXE ) ); } } Kombinowałem coś w tym stylu, ale niestety nie przynosi do pozytywnych rezultatów: void USART_send( uint8_t * data, uint16_t len ) { int i = 0; for( i = 0; i < len; i++ ) { USART1->DR = *( data++ ); while( !( USART1->SR & USART_SR_TXE ) ); } } i czy wskaźnik bajtowy na strukturę może w ogóle tak wyglądać? uint8_t * wsk = & dane; |
|
StuFfii |
» 2013-04-03 22:16:35 <<removed>> |
|
DejaVu |
» 2013-04-03 22:42:08 struct costam { int pole; };
void funkcja( struct costam * zmienna ) { ( * zmienna ).pole = 123; }
struct costam zmienna; funkcja( & zmienna );
|
|
Monika90 |
» 2013-04-04 00:45:40 Nie wiem czy wiesz, ale: void USART_send( uint8_t data[], uint16_t len )
zanczy dokładnie to samo co: void USART_send( uint8_t * data, uint16_t len )
a to: prawie to samo co: czyli obie twoje funkcje robią dokładnie to samo. A przekazać strukturę (przez wskaźnik) do takich funkcji można tak: USART_send(( uint8_t * ) & dane, sizeof dane );
I pomyśl o const . |
|
mkot Temat założony przez niniejszego użytkownika |
» 2013-04-04 07:06:41 Okazało się, że problemem jest ignorowanie zer przez funkcję odbierającą dane na PC. Bibliotekę ściągnąłem z Internetu, na razie nie wnikając jak działa. To się będzie musiało zmienić, albo będę musiał napisać ją sam. Rozmiar int wynosi 4 bajty, a więc moja przykładowa struktura ma 12 bajtów i tyle też dostaje z funkcji sizeof oraz tyle właśnie powinienem odebrać na PC. Sprawdziłem dane przesyłane przez terminal, wyglądają mniej więcej tak: dane.a = 50; dane.b = 51; dane.c = 52;
czyli w ASCII to będzie 1, 2, 3. Dane w terminalu bajt po bajcie to: 1 0 0 0 2 0 0 0 3 0 0 0 Czyli funkcja odbioru dostaje 1, potem 0 i resztę olewa. Może sama biblioteka nie jest najwyższych lotów. Teraz już wiem, gdzie szukać. Funkcję wykorzystuje na razie w taki sposów: RS232_PollComport( 0, tab, 12 ); a same biblioteki ściągnąłem ze strony poniżej. http://www.teuniz.net/RS-232/ |
|
DejaVu |
» 2013-04-04 10:35:27 @Monika90: w przypadku języka C nie ma referencji, więc trzeba się bawić wskaźnikami :) |
|
Monika90 |
» 2013-04-04 13:12:23 Jakie referencje? Przecież nie pisałam nic o referencjach. |
|
DejaVu |
» 2013-04-04 13:15:08 @up: wybacz - źle spojrzałem na ten kod:
USART_send(( uint8_t * ) & dane, sizeof dane );
:) |
|
« 1 » 2 |