【问题标题】:"The semaphore timeout period has expired" error for USB connectionUSB 连接的“信号量超时期限已过”错误
【发布时间】: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 小时后仍然可以。我应该发布答案吗?

标签: c# serial-port usb semaphore usbserial


【解决方案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 端口再次正常工作,没有信号灯超时。

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

        【讨论】:

        • 不,再次修复。谁能建议发生了什么?
        • 当我的 VPN 连接超时时,我得到了这个。我只需要重新连接即可更正它。
        • 我断开了鼠标的连接,无法继续执行您提到的最后几点? :)
        • 我有时会从蓝牙端(因此不涉及远程 USB 端)使用蓝牙串行设备(Microchip/Roving RN42 评估套件)出现此错误。一两次重试后,COM口通常打开,可以发送数据。这是在 Windows 10 1809 上,带有内置的 MS 蓝牙驱动程序。所以它看起来像是蓝牙 COM 端口仿真的神器。
        猜你喜欢
        • 2012-09-03
        • 2015-08-05
        • 2014-04-13
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 2014-09-24
        • 2017-02-06
        相关资源
        最近更新 更多