2

我编写了一些 C# 代码,通过在端口上发出命令并侦听回复来检查设备是否存在于任何 SerialPort 上。当我只是设置端口速度,打开端口,获取串行流并开始处理时,它的工作时间是 100%。但是,我们的一些设备以不同的速度工作,我正在尝试以不同的速度探测设备以自动协商连接并检测设备的存在。

当我在一个线程中完成所有这些操作时,没有任何问题。但是十速下的3s超时是每个串口30s,可能有几个。因此希望同时探测所有端口。

有时这有效。有时 Vista 蓝屏。当我使用线程同时探测所有端口时,它几乎总是蓝屏。当我强迫一切都在一个线程中运行时,它永远不会发生。

USB 串行 Prolific PL-2303 适配器与 x64 驱动程序一起使用。


@Vinko - 感谢您提供有关阅读小型转储的提示。

据我所知,问题的症结在于,通过从不同的线程启动新的异步 I/O 操作,可以为重叠 I/O 赋予全新的含义,从而在驱动程序内部引发竞争条件。由于驱动程序在内核模式下执行,BLAM!

结语

除了开始之外,不要在回调处理程序之外使用 BeginXxx,并且在调用 EndXxx 之前不要调用 BeginXxx,因为你会在内核模式下运行的驱动程序代码中引发竞争条件。

后记

我发现这也适用于套接字流。

4

4 回答 4

2

您还可以在系统属性\高级\开始和恢复\设置下禁用“自动重启”。禁用该功能后,您可以看到 BSOD 并查找错误消息,例如 IRQL_LESS_OR_EQUAL,通过搜索该错误名称,您通常可以缩小问题的根源。

顺便说一句,现在带串口的笔记本不多,所以你一定是用USB-Serial转换器吧?如果是这种情况,驱动程序可能一开始就存在问题,因为大多数制造商将串行端口驱动程序编写为虚拟驱动程序。

于 2008-11-02T13:51:34.930 回答
2

曾经为其中一种设备编写过 Windows 驱动程序,我的建议是不要浪费您的时间在 WinDbg 上尝试证明您已经知道的内容 - 即您使用的驱动程序有问题。

如果您可以从 PL2302 中找到更新的驱动程序,请尝试,但我的建议是,如果您必须使用 USB->串行适配器,基于 FTDI 的适配器是最好的。(他们也不是我为其编写驱动程序的人......)

于 2008-11-05T14:49:35.200 回答
0

蓝屏死机通常意味着有缺陷的驱动程序。

你使用什么样的硬件端口?我遇到过带有 SiLabs CP21xx USB 到串行转换器驱动程序的蓝屏死机。

于 2008-11-02T22:56:23.550 回答
0

在 x64 vista 和 win7 下有稳定的 FTDI 驱动程序。我支持那个说只使用 FTDI 芯片组的人。

我附近商店(加拿大多伦多)的大多数廉价串行 USB 加密狗似乎都是 FTDI 芯片。它从来没有在盒子上,所以我买了一个,如果它好的话,我会去买一整盒。

W

于 2009-08-31T19:00:33.077 回答