程序“Mission Planner”允许运行python脚本以自定义程序的行为。 “Mission Planner”在自己的线程中运行脚本。当线程运行时,我可以选择在“Mission Planner”中按下“Thread.Abort()”的中止按钮。当我按下此按钮时脚本中止,但是当我再次运行脚本时,我这次无法打开串口。我相信这是因为线程在关闭串口之前就会中止。有没有办法健壮地处理Thread.Abort()?或者,当我打开端口时处理这个问题会更好吗?
的链接 的链接下面是我的Python脚本。
注意:这是我的脚本的简化版本,用于演示我的问题。我的脚本旨在在后台运行,直到它被中止。
import clr
clr.AddReference('System')
from System import *
serialPort = IO.Ports.SerialPort("COM3")
serialPort.BaudRate = 9600
serialPort.DataBits = 8
serialPort.Open()
while 1:
print serialPort.ReadLine()
serialPort.Close()
答案 0 :(得分:2)
System.IO.Ports.SerialPort实现IDisposable作为释放已分配资源的工具(在您的情况下是串行端口本身)。使用with statement作为IronPython equivalent的C#'s using statement可以帮助释放Thread.Abort
上的串口。
可以通过以下方式更改脚本:
import clr
clr.AddReference('System')
from System import *
with IO.Ports.SerialPort("COM3") as serialPort:
serialPort.BaudRate = 9600
serialPort.DataBits = 8
serialPort.Open()
while 1:
print serialPort.ReadLine()
侧注(即使它很可能超出您的控制范围):中止线程通常被认为是一种不好的做法(例如参见the many questions around this topic),因为它不是处理外部的安全方式/不受信任/性能拥抱的代码,因为它不保证线程的中止或提供适当的隔离(与使用应用域+策略相比)。正如您已经体验过的那样,执行的线程体/代码也很不方便。