我正在研究Windows和Linux的EBDS協議接口。我試圖將協議所需的所有數據打包到結構中,然後將結構本身和所有其他東西寫入串行端口,並將其發送到設備。爲什麼enum與Windows中的位字段不兼容?
該協議的第一部分是數據封裝和封裝的部件中的一個是控制字節即配襯這樣的描述:
Bit 0: Acknowledgement bit (switchs between 0 and 1 in each send).
Bit 1 to 3: Device Type.
Bit 4 to 6: Message Type.
Bit 7: Unused.
爲了處理TIS控制字節我創建了兩個枚舉和一個結構:
enum E_DEVICE_TYPE
{
E_BILL_ACCEPTOR_WITH_SINGLE_ESCROW = 0x0, // 000
E_RESERVED_1 = 0x1, // 001
E_RESERVED_2 = 0x2, // 010
E_RESERVED_3 = 0x3, // 011
E_RESERVED_4 = 0x4, // 100
E_RESERVED_5 = 0x5, // 101
E_RESERVED_6 = 0x6, // 110
E_RESERVED_7 = 0x7,
};
enum E_MESSAGE_TYPE
{
E_RESERVED = 0x0,
E_STANDARD_OMNIBUS_COMMAND = 0x1,
E_NOT_USED = 0x2,
E_OMNIBUS_WITH_BOOKMARK_MODE = 0x3,
E_CALIBRATE_REQUEST = 0x4,
E_FIRMWARE_DOWNLOAD_REQUEST = 0x5,
E_AUXILIARY_COMMAND_REQUEST = 0x6,
E_EXTENDED_COMMANDS = 0x7,
};
#ifndef LINUX
#pragma pack(1)
#endif
struct sControlByte
{
sControlByte(bool aAcknowledgeFlag, E_DEVICE_TYPE aDeviceType, E_MESSAGE_TYPE aMessageType);
const bool mACK : 1;
const E_DEVICE_TYPE mDevice : 3;
const E_MESSAGE_TYPE mMessageType : 3;
const bool mUnused : 1;
#ifdef LINUX
}__attribute__((packed));
#else
};
#endif
當我問sControlByte的大小結構的值等於6的Windows編譯(Visual Studio 2010中),但在Linux(使用gcc 4.2.3)的結構的大小爲1,符合市場預期。
我試圖擺脫兩個平臺上所需屬性的對齊方式,但我不知道我錯過了什麼¿爲什麼尺寸會根據平臺而變化? ¿我正在使用正確的屬性來控制對齊?
在此先感謝。
VS編譯器也有pack()編譯指示,所以你不需要ifndef它。 –
@Directry ifndef LINUX允許pack()_only_用於MSVC,所以你絕對需要它。 – harper
@harper你說得對,我忽略了它。 –