This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Structures inside a union

I did read some threads on the forum but could not solve my problem.

I want to make a union of to data sets (a structure and an array).

My code is as follows:

#define COMMS_BUFFER_SIZE 80
#define PROTOCOL_HEADER_SIZE 5
#define PROTOCOL_DATA_SIZE (COMMS_BUFFER_SIZE - PROTOCOL_HEADER_SIZE)

typedef struct { u8 StartByte; u8 Route; u8 Command; u8 Length; u8 HCS; u8 Data[PROTOCOL_DATA_SIZE];
}TProtocol;

typedef union { TProtocol Protocol; u8 Data[COMMS_BUFFER_SIZE];
}TCommsBuffer;

extern TCommsBuffer CommsBuffer;

I want to access the contents of "TCommsBuffer" in the protocol format (strucrure) or as a array.

CommsBuffer.Data[x] = x;
CommsBuffer.Protocol.StartByte = x;

But it gives me problems.

When I read data into the Protocol structure, it repeats the contents of the 1st 5 bytes of the protocol structure into its data section.

Is this the correct way to define the union?

Parents
  • I gather that what you want to do is to have a structure 'loaded' via the UART.

    now risking the ire of the smoked sardine, here is a dirty trick I use for that particular purpose:

    
    in structs.h
    typeded struct
    {
    
    ....
    
    } STR_RSIF
    
    
    in defines .h
    // duplicate names
    extern xdata STR_RSIF GSTrsin;
    extern UX8            GSTrstp[];
    
    in a .a51 module
    
    .....
               PUBLIC GSTrstp
               PUBLIC GSTrsin
    ......
    GSTrstp:         ds 0     ; duplicate of the below
    GSTrsin:         ds 0100h ; what it is (withheld)
    

    totally nonstandard, totally not portable, uses assembler and I am sure Mr. Sprat can find more to pour bile about, but it works and does not in any way violate the specification of the tools (Keil).

    Erik

Reply
  • I gather that what you want to do is to have a structure 'loaded' via the UART.

    now risking the ire of the smoked sardine, here is a dirty trick I use for that particular purpose:

    
    in structs.h
    typeded struct
    {
    
    ....
    
    } STR_RSIF
    
    
    in defines .h
    // duplicate names
    extern xdata STR_RSIF GSTrsin;
    extern UX8            GSTrstp[];
    
    in a .a51 module
    
    .....
               PUBLIC GSTrstp
               PUBLIC GSTrsin
    ......
    GSTrstp:         ds 0     ; duplicate of the below
    GSTrsin:         ds 0100h ; what it is (withheld)
    

    totally nonstandard, totally not portable, uses assembler and I am sure Mr. Sprat can find more to pour bile about, but it works and does not in any way violate the specification of the tools (Keil).

    Erik

Children