使用定时器从 USB 读取
我是使用 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
该方法称为
CancelIo
(带有大写的I
),而不是Cancello
(带有小写的l
) )。The method's called
CancelIo
(with an upper-caseI
), notCancello
(with a lower-casel
).