USB 连接的“信号量超时期限已过”错误

Posted

技术标签:

【中文标题】USB 连接的“信号量超时期限已过”错误【英文标题】:"The semaphore timeout period has expired" error for USB connection 【发布时间】:2012-12-09 13:59:07 【问题描述】:

我收到此错误...

信号量超时期限已过。

在这条线上……

ThePorts.ActivePort1.Open();

...但我只是偶尔会得到它。当它发生时,它会一遍又一遍地发生。然后问题消失了,几个小时或几天,然后又回来了。

串行端口是连接蓝牙的 USB。

我认为这家伙遇到了一个非常相似的问题,但不是在 C# 中

Freeze on SerialPort.Open / DeviceIoControl / GetcommState with usbser.sys

尽我所能估计,我已经阅读了他的整个问题,以及由此产生的 cmets 和答案,但我真的无法弄清楚是哪一个解决了他的问题,或者 C# 是否与他所经历的有很大不同.

感谢您对无知者的任何帮助。这是实际发生的代码。

public static void Open_ActivePortWeWillUse(String Drone_StringNameFromUser)

    SerialPort TempSerialPort = new SerialPort(Drone_StringNameFromUser, (int) SerialPortSpeed);

    ThePorts.ActivePort1 = TempSerialPort;

    ThePorts.ActivePort1.DataBits = 8;
    ThePorts.ActivePort1.Parity = Parity.None;
    ThePorts.ActivePort1.StopBits = StopBits.One;

    ThePorts.ActivePort1.DataReceived += new SerialDataReceivedEventHandler(OurBackGroundSerialPortReceiver);

    ThePorts.ActivePort1.Open();  // "Sometimes" Error hits here

【问题讨论】:

这是一个低级 Windows 错误,ERROR_SEM_TIMEOUT,错误代码 121。高度特定于使用信号量的代码。 .NET SerialPort 类不在任何地方使用信号量。您正在使用的模拟串行端口的蓝牙驱动程序肯定正在使用一个,它是本机代码中使用的常见同步对象。有错误的驱动程序出现这类问题并不罕见。 除了之前的评论:在您正在工作的级别(.NET 客户端)上,您无法使用有缺陷的串行端口驱动程序做任何事情。在您链接的帖子中,真正的答案在 cmets 中:“问题源于设备的固件故障”。 谢谢汉斯和亚历克斯。不知道我是否找到了答案,但我 THINK 这个页面((eHow Page On Misbehaving USB hubs)) 解释了该怎么做。虽然这不是我在整个互联网上最喜欢的,但如果它给了我答案,那就好了;随便。 3 小时后仍然可以。我应该发布答案吗? 【参考方案1】:

我有一个类似的问题,我通过更改端口驱动程序中的端口设置(位于设备管理器的端口中)以适应我正在使用的设备。

对我来说,设置了错误的每秒位数。

【讨论】:

【参考方案2】:

一口气处理了太多大文件。 Windows barfs。本质上,复制花费了太长时间,因为您对计算机的要求太多,并且文件锁定被锁定的时间太长并且设置了一个标志,该标志是一个信号量错误。

计算机自己塞住并窒息了。我看到这里的 RAM 内存逐渐被 RAM 中的缓存填充。然后当填充子系统时,由于信号量错误而停止。

我有一个解决方法;复制或传输更少的文件,而不是一个巨大的块。将其分解为多组块并一次发送一个文件,可能一次发送几个文件,但绝不是很多。

参考资料:

https://appuals.com/how-to-fix-the-semaphore-timeout-period-has-expired-0x80070079/

https://www-01.ibm.com/support/docview.wss?uid=swg21094630

【讨论】:

【参考方案3】:

在与 Arduino Leonardo 通信时,我在两台不同的 Windows 计算机上也遇到了这个问题。可靠的解决方案是:

在设备管理器中找到 COM 端口并打开设备属性。 打开“端口设置”​​选项卡,然后单击高级按钮。 在那里,取消选中“使用 FIFO 缓冲区(需要 16550 兼容的 UART)”框,然后按 OK。

很遗憾,我不知道这个功能有什么作用,或者它如何影响这个问题。在几次 PC 重新启动和十几个设备连接循环之后,这是唯一可靠地解决了该问题的方法。

【讨论】:

是的 - 将一个字节写入 USB 串行端口。重试 14 次后工作;)所以只需将 FIFO 发送缓冲区设置为 1(即禁用它)【参考方案4】:

如果您遇到网络延迟或互联网或本地网络问题,也可能会出现此错误。对应失败的桥接连接也可能是罪魁祸首。

【讨论】:

【参考方案5】:

好的,我现在连接没有信号量超时问题。

如果有人在阅读时遇到过同样的事情,我希望这个程序对你有用;但没有承诺;嘿,是窗户。

在我的例子中,这是 Windows 7

我从This page 那里得到了一点关于 eHow 的提示;不确定这是否对任何人都有帮助。

不管怎样,这就是对我有用的简单的 23 步程序

点击开始按钮

选择控制面板

从控制面板中选择设备管理器

从设备管理器中,选择通用串行总线控制器

在通用串行总线控制器中,单击侧面的小三角形

我无法预测您会在计算机上看到什么,但在我的计算机上我得到了一个长长的下拉列表

开始调查,找出此列表中的哪一个成员是罪魁祸首...

在下拉列表的每个成员上,右键单击名称

将打开一个列表,选择属性

猜测时间:使用打开的结果窗口顶部附近的各种选项卡,猜测这是否是 USB 适配器驱动程序因信号量超时而阻塞您的东西

做出正确猜测后,关闭 USB 根集线器属性窗口(但保持设备管理器窗口打开)。

从该 USB 集线器物理断开任何东西。

拔掉它。

将鼠标指针返回到您之前确定的列表中的那个 USB 根集线器。

再次右击

选择卸载

让 Windows 做自己的事

稍等

如果有时间,请关闭整个计算机;有人说这是必需的。我想我没有它就逃脱了。

将 USB 集线器插回 PC 上的 USB 连接器

如果设备管理器中的列表闪烁并闪烁几下,没关系。

将蓝牙连接器插回 USB 集线器

让 windows 做更多的事情

在两分钟内,我的 COM 端口再次正常工作,没有信号灯超时。

希望它适用于可能遇到类似问题的其他人。

【讨论】:

不,再次修复。谁能建议发生了什么? 当我的 *** 连接超时时,我得到了这个。我只需要重新连接即可更正它。 我断开了鼠标的连接,无法继续执行您提到的最后几点? :) 我有时会从蓝牙端(因此不涉及远程 USB 端)使用蓝牙串行设备(Microchip/Roving RN42 评估套件)出现此错误。一两次重试后,COM口通常打开,可以发送数据。这是在 Windows 10 1809 上,带有内置的 MS 蓝牙驱动程序。所以它看起来像是蓝牙 COM 端口仿真的神器。

以上是关于USB 连接的“信号量超时期限已过”错误的主要内容,如果未能解决你的问题,请参考以下文章

大疆御遥控器改增强信号的模块,在下面usb取电,导致侧usb口连接不上手机,怎么解决?

虚拟机Linux下USB网卡搜不到Wifi信号!

virtualbox安装xp虚拟机,加载了usb无线网卡,但是找不到那个无线网络连接,那个显示信号强度的东西?

海信液晶电视怎么连接无线,连接的时候提示没有USB网卡怎么回事?

netcore USB网卡

usb延长器比较