使用定时器从 USB 读取

发布于 2024-12-25 05:15:44 字数 2851 浏览 1 评论 0原文

我是使用 USB 的新手,正在尝试弄清楚如何运行后台计时器,然后当它触发时,从 USB 设备读取数据。以下是我用来启动计时器的方法以及计时器到期时触发的方法:

void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    //ReadUSB();
}

private void wndwMain_ContentRendered(object sender, EventArgs e)
{
    USBInit();
    if (deviceFound)
    {
        System.Timers.Timer myTimer = new System.Timers.Timer(1000);
        myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
        myTimer.Start();
    }
}

现在我想调用 ReadUSB(),但我抛出了 EntryPointNotFound 异常。我正在使用 Jan Axelson 的 USB 完整版中的 USB 代码。我知道延迟对于 USB 来说太长了,我只是将其放在那里用于测试目的,并且在验证一切正常后会减少延迟。

ReadUSB() 中的异常:

private void ReadUSB()
    {
        IntPtr eventObject = IntPtr.Zero;
        NativeOverlapped HidOverlapped = new NativeOverlapped();
        Byte[] inputReportBuffer = null;
        Int32 numberOfBytesRead = 0;
        Int32 result = 0;
        Boolean success = false;
        IntPtr unManagedBuffer = IntPtr.Zero;
        IntPtr unManagedOverlapped = IntPtr.Zero;

        Array.Resize(ref inputReportBuffer, Capabilities.InputReportByteLength);

        eventObject = CreateEvent
            (IntPtr.Zero,
            false,
            false,
            String.Empty);

        HidOverlapped.OffsetLow = 0;
        HidOverlapped.OffsetHigh = 0;
        HidOverlapped.EventHandle = eventObject;

        unManagedBuffer = Marshal.AllocHGlobal(inputReportBuffer.Length);
        unManagedOverlapped = Marshal.AllocHGlobal(Marshal.SizeOf(HidOverlapped));
        Marshal.StructureToPtr(HidOverlapped, unManagedOverlapped, false);

        readHandle = CreateFile
            (devicePathName,
            GENERIC_READ,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            IntPtr.Zero,
            OPEN_EXISTING,
            FILE_FLAG_OVERLAPPED,
            0);

        success = ReadFile
            (readHandle,
            unManagedBuffer,
            inputReportBuffer.Length,
            ref numberOfBytesRead,
            unManagedOverlapped);

        // If ReadFile returned true, report is available. Otherwise, check for completion
        if (!success)
        {
            result = WaitForSingleObject
                (eventObject, 3000);

            switch (result)
            {
                case WAIT_OBJECT_0:
                    success = true;
                    GetOverlappedResult
                        (readHandle,
                        unManagedOverlapped,
                        ref numberOfBytesRead,
                        false);
                    break;
                case WAIT_TIMEOUT:
                    Cancello(readHandle);  <-- Exception thrown here.
                    break;
                default:
                    Cancello(readHandle);
                    break;
            }
        }

I am new to using USB and am trying to figure out how to run a background timer and then when it fires, read from the USB device. Here is what I am using to start my timer and the method that fires when it expires:

void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    //ReadUSB();
}

private void wndwMain_ContentRendered(object sender, EventArgs e)
{
    USBInit();
    if (deviceFound)
    {
        System.Timers.Timer myTimer = new System.Timers.Timer(1000);
        myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
        myTimer.Start();
    }
}

Now I want to call ReadUSB(), but I am throwing an EntryPointNotFound exception. I am using the USB code from Jan Axelson's USB complete. I know the delay is too long for USB, I just put it in there for testing purposes and will reduce it once I verify everything is working.

The exception in ReadUSB():

private void ReadUSB()
    {
        IntPtr eventObject = IntPtr.Zero;
        NativeOverlapped HidOverlapped = new NativeOverlapped();
        Byte[] inputReportBuffer = null;
        Int32 numberOfBytesRead = 0;
        Int32 result = 0;
        Boolean success = false;
        IntPtr unManagedBuffer = IntPtr.Zero;
        IntPtr unManagedOverlapped = IntPtr.Zero;

        Array.Resize(ref inputReportBuffer, Capabilities.InputReportByteLength);

        eventObject = CreateEvent
            (IntPtr.Zero,
            false,
            false,
            String.Empty);

        HidOverlapped.OffsetLow = 0;
        HidOverlapped.OffsetHigh = 0;
        HidOverlapped.EventHandle = eventObject;

        unManagedBuffer = Marshal.AllocHGlobal(inputReportBuffer.Length);
        unManagedOverlapped = Marshal.AllocHGlobal(Marshal.SizeOf(HidOverlapped));
        Marshal.StructureToPtr(HidOverlapped, unManagedOverlapped, false);

        readHandle = CreateFile
            (devicePathName,
            GENERIC_READ,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            IntPtr.Zero,
            OPEN_EXISTING,
            FILE_FLAG_OVERLAPPED,
            0);

        success = ReadFile
            (readHandle,
            unManagedBuffer,
            inputReportBuffer.Length,
            ref numberOfBytesRead,
            unManagedOverlapped);

        // If ReadFile returned true, report is available. Otherwise, check for completion
        if (!success)
        {
            result = WaitForSingleObject
                (eventObject, 3000);

            switch (result)
            {
                case WAIT_OBJECT_0:
                    success = true;
                    GetOverlappedResult
                        (readHandle,
                        unManagedOverlapped,
                        ref numberOfBytesRead,
                        false);
                    break;
                case WAIT_TIMEOUT:
                    Cancello(readHandle);  <-- Exception thrown here.
                    break;
                default:
                    Cancello(readHandle);
                    break;
            }
        }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

贪了杯 2025-01-01 05:15:44

该方法称为 CancelIo(带有大写的 I),而不是 Cancello(带有小写的 l) )。

The method's called CancelIo (with an upper-case I), not Cancello (with a lower-case l).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文