Чтение с USB с использованием таймера - PullRequest
1 голос
/ 05 января 2012

Я новичок в использовании 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. Я использую 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;
            }
        }

1 Ответ

1 голос
/ 05 января 2012

Метод называется CancelIo (в верхнем регистре I), а не Cancello (в нижнем регистре l).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...