Main questions on the very bottom if not up for reading everything.

So a few years ago I tackled my first programming project, googling literally everything as I'm writing the code, learning to code by coding. As you can imagine, I made a few mistakes. What I was doing is transcribing the MDB protocol (vending machine language) into a c program so I could interface an Arduino with one. Well, this turned into like 1 or 2 thousand lines of code (still not even a quarter done!), and years later, I need this code again, I intend to tidy it up, and finish it. I'm still a C newbie, but have actually fully read a C tutorial, now just need hands on experience to burn it all into my brain.

Here's the first few lines of my code, an important part that acts as a middle man between the code and the UART buffer, allowing me to easily access the 9th bit and the 8 data bits separately. Additionally, I was attempting to create a shortcut for accessing 3 specific data bits, which makes things easier and more readable later in the code.

Code:
union nineBit {                       //Union allows writing mode and data bits simultaneously as a short, therefore not overwriting one another.  Bit format: dddddddd_______m
    struct {                          //Structure allows accessing 8 data bits and 1 mode bit separately, as well as setting the parent union's size.
        unsigned char data : 8;       //8 data bits dddddddd most significant byte when written to as a short..
        unsigned char mode : 1;       //1 mode bit  _______m least significant byte when written to as a short.
    } part;                           //Named for readability & organization of code.
    unsigned short whole;               //Allows writing the 'data' and 'mode' all at once, otherwise the second write would erase the first.
    unsigned char command : 3;        //The three bits containing a command in an address byte.  mdddddccc. 
} block[35];                          //Array of 9 bit data, 36 is the maximum amount of 'bytes' MDB allows per transmission.
Given the short datatype, let each number represent a bit's location.
01234567 89ABCDEF

Goals:
I want to write to block[0].whole when interacting with the UART buffer. It should write the 9 bits of data in 0-7 and F, not 7-F. This seems wrong, but I do remember this code working, so reading 9 bit data from the UART buffer, if I remember right, you read it as two separate characters, which makes it easy to flip the mode bit around if needed then write the two bytes as a short. So I think this is good.

I want to read from block[0].data and have it give me bits 0-7, not 8-F. This seems to be correct.

I want to read from block[0].mode and have it give me bit F. This seems to be correct.

I want to read from block[0].command and have it give me bits 0-2, however this doesn't seem like it'd work at all, and I think I remember it being an issue trying to use it. How can I fix this? Can I change it to a short and somehow flip the endianness? Can I do some pointer magic somehow?