Forum: Compiler & IDEs Cast von einem struct


von Simon (Gast)


Lesenswert?

1
typedef union
2
{
3
    // 8-bit data
4
    struct
5
    {
6
        UINT16  data8bit    : 8;
7
    };
8
9
    // 9-bit data
10
    struct
11
    {
12
        UINT16  data9bit    : 9;
13
    };
14
15
    UINT16 __data;
16
} UART_DATA;
17
18
19
extern inline void __attribute__((always_inline)) UARTSendData( UART_MODULE id, UART_DATA data )
20
{
21
    uartReg[id]->tx.reg = data.__data;
22
}


Frage: Wie muss ich *data casten damit er das akzeptiert?


1
void debug_puts(char *data) {
2
    do
3
    {
4
        while(UARTTransmitterIsReady(DEBUG_UART));
5
        UARTSendData(DEBUG_UART, (????)(*data));
6
    } while( *data++ );
7
}

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Frage: Wie muss ich *data casten damit er das akzeptiert?

überhaupt nicht.

ein char wird kein uint16.

von Peter II (Gast)


Lesenswert?

soll auch ohne cast gehen
1
void debug_puts(char *data) {
2
    UART_DATA tmp;
3
    do
4
    {
5
        while(UARTTransmitterIsReady(DEBUG_UART));
6
        tmp.data8bit = *data;
7
        UARTSendData(DEBUG_UART, tmp);
8
    } while( *data++ );
9
}

von Simon (Gast)


Lesenswert?

Was auch geht ist ein:

UARTSendData(DEBUG_UART, (UART_DATA)(UINT16)(*data));

Aber bisher noch ungetestet, compilen tut ers.

von Peter II (Gast)


Lesenswert?

Simon schrieb:
> Was auch geht ist ein:
>
> UARTSendData(DEBUG_UART, (UART_DATA)(UINT16)(*data));
>
> Aber bisher noch ungetestet, compilen tut ers.

warum überhaupt diese struct? übergib doch der UARTSendData einfach 
2Parameter einmal für das 1.byte und einmal für das nächst e bit.

Wie soll denn jetzt UARTSendData wissen, ob es 9 oder 8 bit senden soll? 
Wenn du  data8bit setzt, dann änderst du damit auch nicht das 9.bit.

von Simon (Gast)


Lesenswert?

Peter II schrieb:
> Wie soll denn jetzt UARTSendData wissen, ob es 9 oder 8 bit senden soll?
> Wenn du  data8bit setzt, dann änderst du damit auch nicht das 9.bit.

Naja, die sache ist das nen PIC32 UART sowohl ein 9 als auch ein 8 Bit 
transfer kann. das wird dann in der microchip lib anhand der 
konfiguration des UARTs bestimmt.

von Dr. Sommer (Gast)


Lesenswert?

Simon schrieb:
> UINT16 __data;
Namen von Funktionen/Variablen/Typen die du selbst definierst dürfen 
nicht mit zwei Unterstrichen beginnen. Diese sind reserviert für den 
Compiler+Standard Library. Wenn es funktioniert ist es pures Glück, bei 
der nächsten Compiler-Version kann's schon schiefgehen. Also besser 
umbenennen...

Siehe hier: 
http://www.gnu.org/software/libc/manual/html_node/Reserved-Names.html

von Simon (Gast)


Lesenswert?

Meinst du?:

UINT16 __data;


Ich bin unschuldig, das war microchip selbst

von Dr. Sommer (Gast)


Lesenswert?

Simon schrieb:
> Meinst du?:
Hä? Ja, das hab ich doch geschrieben?!

Simon schrieb:
> Ich bin unschuldig, das war microchip selbst
Achso, dann hats Microchip falsch gemacht. ST sind da auch Experten 
drin.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.