【问题标题】:Check if serial port is listening检查串口是否在监听
【发布时间】:2012-10-07 10:44:55
【问题描述】:

我有一个 Arduino 通过串口使用 Python 脚本发送和接收指令。

Arduino 处于一个按钮状态,当它被按下时,它会通过串口向 Python 脚本发送一条消息并等待响应。 (通过Serial.available())。它工作得很好。

但是,如果 Python 脚本因任何原因崩溃(理想情况下它将在后台运行,因此无法轻松检查),Arduino 将永远等待并且即使在脚本重新启动时也不可用。

有没有办法让我的 Arduino 检查串口是否有东西在监听? (如果没有,用闪光灯等提醒我)或者这不是串行的工作方式吗?最坏的情况我想我可以使用超时,虽然这并不理想。

【问题讨论】:

    标签: serial-port arduino


    【解决方案1】:

    使用 DSR/DTR 引脚来检测对方是否有东西在监听的能力有限。

    当您在运行脚本的机器上打开串行端口时,它应该提升其 DTR 引脚(或者您应该能够说服它这样做:您用来驱动 COM 端口的库的文档应该告诉你怎么做)。

    然后,在您的 Arduino 上,您可以定期检查其 DSR 引脚(假设使用握手的空调制解调器接线,其中 PC DTR 引脚连接到 Arduino 上的 DSR+CD),并处理“无人连接”以任何你认为合适的方式。

    这种方法的一个问题是您的 PC 脚本在崩溃/停止响应时可能不会关闭串行端口,从而使 DTR 引脚处于启用状态,就好像一切正​​常。此外,由于串行线路上的错误,您的脚本可能会错过来自 Arduino 的消息。

    因此,您应该始终在您的接收例程中实现超时:即使有一方在另一端监听,也不能保证它已经收到您的消息(或者它的回复将完好无损)。

    如果发生超时,至少重新发送一次消息(假设引发了 DSR)会使您的协议更加可靠。

    【讨论】:

    • 干杯伙伴。有趣的是,谷歌在你发布后 3 分钟就选择了你的答案。
    • 杰夫·阿特伍德在推特上说谷歌几乎占该网站流量的 50%。 (当找不到推文,我的 google foo 今天不工作了)
    • 嘿,谢谢你的开始提示,但不幸的是,我找不到更多关于这方面的信息。您能否提供一些示例代码如何访问 Arduino 的 DSR 引脚?干杯!
    【解决方案2】:

    Arduino不使用DSR线或任何其他握手线,所以你不能按照你的建议去做。

    【讨论】:

      【解决方案3】:

      我同意 mdb 的观点,即超时是必要的,但还要补充一点,您可能希望实现简单的质询/响应系统,该系统会定期检查是否有人在听。 (我喜欢 ircd 的乒乓类比)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-22
        • 1970-01-01
        • 2012-06-09
        • 2014-04-26
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 1970-01-01
        相关资源
        最近更新 更多