Вот на C# код для расчета CRC Modbus, видно что хоть и на C или на чем там у вас, отличается

Код:
public static ushort CRC16_Modbus(byte[] msg)
        {
            const ushort polinom = 0xa001;
            ushort code = 0xffff;

            for (int i = 0, size = msg.Length; i < size; ++i)
            {
                code ^= (ushort)(msg[i] << 8);

                for (uint j = 0; j < 8; ++j)
                {
                    code >>= 1;
                    if ((code & 0x01) != 0) code ^= polinom;
                }
            }
            return code;
        }