Не знаю, что у Вас в первых 2-х байтах, но buf[0]<<8 всегда должен давать 0, т.к. размер buf[0] - 8 бит. Правильная склейка должна предусматривать предварительное приведение октетов к unsigned short:
( (unsigned short)(buf[0]) <<8) | (unsigned short)(buf[1])