> а теперь покажите мне безграмотному, как из этого получить #GHLGTMOHTISS\r, т.е. 01 50 d6 81, грамотный вы наш,

короткий ответ: никак.

во-первых, заголовок пакета должен выглядеть так:

Код:
typedef union tagOwenHeader
{
	struct
	{
		int	High : 8;
		int	Size : 4;
		int	Query : 1;
		int	Low : 3;
	};

	unsigned char Bytes[2];
}OWEN_HEADER, *POWEN_HEADER;
во-вторых, так как адрес у вас 11-битный, засовывать его в заголовок надо так:

Код:
hdr.High = addr >> 3;
hdr.Low = addr & 0x07;
и в результате вы получите то, что и должны:

40 30 D6 81 11 6D и #KGJKTMOHHHMT\В

ну и для всех остальных.

порядок и размер членов битового поля стандартом C не определяется. на другой платформе или компиляторе вы можете получить другие результаты. использование union -- плохая практика, особенно когда записывается один элемент, а читается другой.

и вообще, все это стрельба из пушки по воробьям, потому что проще и понятней писать сразу в буфер (Command в нашем случае).