IronPython / C#运行脚本后我无法重新打开串口

时间:2014-02-01 05:18:28

标签: c# python multithreading serial-port ironpython

程序“Mission Planner”允许运行python脚本以自定义程序的行为。 “Mission Planner”在自己的线程中运行脚本。当线程运行时,我可以选择在“Mission Planner”中按下“Thread.Abort()”的中止按钮。当我按下此按钮时脚本中止,但是当我再次运行脚本时,我这次无法打开串口。我相信这是因为线程在关闭串口之前就会中止。有没有办法健壮地处理Thread.Abort()?或者,当我打开端口时处理这个问题会更好吗?

以下是Mission Planner GitHub

的链接

以下是Mission Planner Program

的链接

下面是我的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()

1 个答案:

答案 0 :(得分:2)

System.IO.Ports.SerialPort实现IDisposable作为释放已分配资源的工具(在您的情况下是串行端口本身)。使用with statement作为IronPython equivalentC#'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),因为它不是处理外部的安全方式/不受信任/性能拥抱的代码,因为它不保证线程的中止或提供适当的隔离(与使用应用域+策略相比)。正如您已经体验过的那样,执行的线程体/代码也很不方便。