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

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

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

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


@Vinko - 感谢阅读minidumps的提示。

尽我所知,问题的症结在于,通过从不同的线程启动新的异步I / O操作,可以为重叠的I /提供全新的含义O,在驾驶员内部引发竞争状态。由于驱动程序在内核模式下执行, BLAM!

后记

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

后记

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

有帮助吗?

解决方案

为这类设备之一编写Windows驱动程序一次,我的建议是不要浪费你的时间用WinDbg试图证明你已经知道的东西 - 即你使用的驱动程序是错误的。

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

其他提示

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

Btw,现在没有多少笔记本带有串口,所以你必须使用USB-Serial转换器?如果是这种情况,驱动程序可能是一个问题,因为大多数制造商都将串行端口驱动程序写为虚拟驱动程序。

BSOD通常意味着有缺陷的司机。

您使用哪种硬件端口?我有使用SiLabs CP21xx USB转串口转换器驱动程序的BSOD。

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

在我附近的商店(加拿大多伦多),大多数廉价的连接到usb加密狗似乎都是FTDI芯片。它从不在盒子上,所以我买了一个,如果它好,我去买一个装满它们的盒子。

w ^

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top