4

在与我的 HID 设备的数据传输会话结束时,我的软件有大约 20% 的机会在函数 WriteFile 上停止。

这是用 C# 编写的,我不知道为什么会这样。每个数据包 20% 的错误率根本无法接受,我很难深入了解它,我想知道这是否与我的声明或数据类型有关?

这是进口

[DllImport("kernel32.dll")] 
    static public extern int WriteFile(int hFile, ref byte lpBuffer, int nNumberOfBytesToWrite, ref int lpNumberOfBytesWritten, int lpOverlapped);

这是对正在停止的函数的调用

Result = USBSharp.WriteFile(hidHandle, ref outputReportBuffer[0], outputReportBuffer.Length, ref NumberOfBytesWritten, 0);

句柄被确认是有效的,其余的都是不言自明的......

该函数永远不会返回。我已经在几个不同的位置在线查找了这个问题,但几乎没有人的修复适用于我。如果它失败了,我只会线程化它并重新调用它,但是在数百个数据包上做这 20% 的时间简直是……糟糕。

我正在使用 Windows 7、C#、.NET 4.0,并且 HID 设备没有停止它仍然处于活动状态并正在运行 - 不仅如此,整个数据传输都正常进行,并且此调用发生在最后完成事务和然后停止(即使我已经拥有所有数据)。不幸的是,我不能忽略交易的最后一部分,因为这些数据需要 100% 维护,否则用户会发生糟糕、糟糕、糟糕的事情。

4

3 回答 3

5

如果问题仍然存在,那么您可以考虑实施超时机制:

var stream= new FileStream(hidHandle,FileAccess.Write,false);
var waitEvent= new ManualResetEventSlim();

void Write(byte[] report, int timeout){
    waitEvent.Reset();
    stream.BeginWrite(report,0,report.Lenght,(ar)=>{stream.EndWrite(ar);waitEvent.Set();},null);
    waitEvent.Wait(timeout);
}
于 2012-09-27T20:16:47.163 回答
3

听起来像是 USB 驱动程序库中的问题。这是您的情况下唯一的唯一变量。(例如,很多人使用带有 USB 驱动器的 WriteFile 没有任何问题)。

我建议您联系 Florian Leitner 寻求支持,或寻找其他连接 USB 设备的方法。Forian 详细说明了它使用USBSharp类和Scott Hanselman 的文章,所以也许这些都是很好的替代品。

于 2012-09-27T20:26:50.113 回答
2

很难猜出这里出了什么问题,但是,这里有一些重要的检查/尝试:

检查您是否从不安全的上下文中调用 CreateFile WriteFile阅读有关不安全代码的更多信息 并让这个不安全的上下文使用 unsafe 关键字,如下所示:

unsafe static void writeMyFile(...){
...
}

还要检查项目属性中的选项(允许不安全代码),如下所示: 允许不安全的代码

我希望这将有所帮助。

于 2012-09-27T16:31:29.350 回答