Control Freak
Control Freak

Reputation: 13243

How to read the weight from a Weight USB Scale

I have a USB weighing from stamps.com (Model 510: http://www.stamps.com/postage-online/digital-postage-scales/)

I was able to find the drivers to make it stand alone online, but my next question is how do I read the weight of the object on the scale in my classic ASP page / VBScript.

Does anyone have any suggestions where I should begin my search?

Upvotes: 0

Views: 4184

Answers (1)

nvuono
nvuono

Reputation: 3363

I'm not sure if this is applicable to your specific model but there's an article at http://nicholas.piasecki.name/blog/2008/11/reading-a-stamps-com-usb-scale-from-c-sharp/ where the author has written C# code to read from the scale because it conforms to basic USB HID (human input device) standards. The author made use of Mike OBrien's HID library https://github.com/mikeobrien/HidLibrary

They start off getting the raw bytes:

HidDeviceData inData;
HidDevice[] hidDeviceList;
HidDevice scale;

hidDeviceList = HidDevices.Enumerate(0x1446, 0x6A73);

if (hidDeviceList.Length > 0)
{
    int waitTries;

    scale = hidDeviceList[0];
    waitTries = 0;

    scale.Open();

    if (scale.IsConnected)
    {
        inData = scale.Read(250);

        for (int i = 0; i < inData.Data.Length; ++i)
        {
            Console.WriteLine("Byte {0}: {1:X}", i, inData.Data[i]);
        }
    }

    scale.Close();
    scale.Dispose();
}

Then go on to reverse engineer the payload and construct a function to get the weight in ounces:

private void GetStampsComModel2500iScaleWeight(out decimal? ounces, out bool? isStable)
{
    HidDeviceData inData;
    HidDevice[] hidDeviceList;
    HidDevice scale;

    isStable = null;
    ounces = null;

    hidDeviceList = HidDevices.Enumerate(0x1446, 0x6A73);

    if (hidDeviceList.Length > 0)
    {
        int waitTries;

        scale = hidDeviceList[0];
        waitTries = 0;

        scale.Open();
        // For some reason, the scale isn't always immediately available
        // after calling Open(). Let's wait for a few milliseconds before
        // giving up.
        while (!scale.IsConnected && waitTries < 10)
        {
            Thread.Sleep(50);
            waitTries++;
        }

        if (scale.IsConnected)
        {
            inData = scale.Read(250);
            ounces = (Convert.ToDecimal(inData.Data[4]) +
                Convert.ToDecimal(inData.Data[5]) * 256) / 10;
            isStable = inData.Data[1] == 0x4;
        }

        scale.Close();
        scale.Dispose();
    }
}

In order to read the weight from your classic ASP page/VBScript (on the server, right?) the easiest solution looks to be turning the working C# class into a COM component. There are tutorials you can follow to create the C# COM Component and register it on the server, then you would call it from VBScript like:

Dim app 
Set app = Server.CreateObject("MyScaleComponent") 

Upvotes: 2

Related Questions