6

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

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

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

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

4

3 回答 3

7

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

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

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

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

出于这个原因,您应该始终在您的接收例程中实现超时:即使有一方在另一端监听,也不能保证它已经收到您的消息(或者它的响应会完好无损地到达您)。

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

于 2008-10-12T10:46:23.873 回答
1

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

于 2010-03-29T20:19:43.547 回答
0

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

于 2008-10-12T11:29:23.457 回答