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
[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:

C/C++
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:

C/C++
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:
C/C++
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;
P-79888
StuFfii
» 2013-04-03 22:16:35
<<removed>>
P-79889
DejaVu
» 2013-04-03 22:42:08
C/C++
struct costam
{
    int pole;
};

void funkcja( struct costam * zmienna )
{
    ( * zmienna ).pole = 123;
}
//...
struct costam zmienna;
funkcja( & zmienna );
P-79894
Monika90
» 2013-04-04 00:45:40
Nie wiem czy wiesz, ale:
C/C++
void USART_send( uint8_t data[], uint16_t len )
zanczy dokładnie to samo co:
C/C++
void USART_send( uint8_t * data, uint16_t len )
a to:
C/C++
data[ i++ ]
prawie to samo co:
C/C++
*( data++ )
czyli obie twoje funkcje robią dokładnie to samo.

A przekazać strukturę (przez wskaźnik) do takich funkcji można tak:
C/C++
USART_send(( uint8_t * ) & dane, sizeof dane );

I pomyśl o
const
.
P-79902
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:

C/C++
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/
P-79903
DejaVu
» 2013-04-04 10:35:27
@Monika90: w przypadku języka C nie ma referencji, więc trzeba się bawić wskaźnikami :)
P-79905
Monika90
» 2013-04-04 13:12:23
Jakie referencje? Przecież nie pisałam nic o referencjach.
P-79910
DejaVu
» 2013-04-04 13:15:08
@up: wybacz - źle spojrzałem na ten kod:
C/C++
USART_send(( uint8_t * ) & dane, sizeof dane );
:)
P-79911
« 1 » 2
  Strona 1 z 2 Następna strona