0

使用 Python,我需要强制关闭使用不同程序打开的 COM 端口。我无法关闭 COM 端口,因为我无法启动与它的会话,因为它已经在其他地方打开了。

import visa

rm = visa.ResourceManager()

# list all the COM ports connected to PC
print(rm.list_resources())

# open a device session on one COM port
dev = rm.open_resource('COM12')
# this can't be done if the 'COM12' is already opened somewhere else

# I need to close 'COM12' like this
# but can't access it because its already opened
dev.close()

如果它是在不同的程序中打开的,有没有办法强制关闭像“COM12”这样的会话?当其他软件 (LabVIEW) 遇到错误时,它会崩溃并经常使 COM 端口保持打开状态,这会阻止我在不手动关闭物理设备的情况下访问它们。最好强制它们关闭,以便它们可以再次正确打开。

4

2 回答 2

2

我很确定如果 LabVIEW 崩溃,操作系统会代表它释放所有硬件资源。

但请记住,LabVIEW 是一个运行子程序的运行时环境。因此,如果子程序中止,LabVIEW 进程本身可能仍在运行。在 LabVIEW 环境中编写一个在 COM12 上调用 VISA Close 的小型 LabVIEW 程序很容易,并且应该可以解决问题。您也可以退出 LabVIEW 进程。

最后,我偶尔会看到串行设备驱动程序(特别是对于非标准串行端口,例如使用 USB 或以太网的那些)如果您的程序不能完美地完成所有操作,例如优雅地调用 close,就会遇到问题。在这些情况下,有时您必须重新启动才能使设备驱动程序进入正确的状态。

于 2019-06-20T22:22:21.827 回答
1

虽然我没有一个明确的答案,但我很确定它是:不。就像这样,没有好的方法可以做到这一点。

硬件资源由操作系统处理。如果一个进程打开了一个资源但没有释放它,你就不能“未经同意”就去窃取它。那会使另一个进程崩溃。操作系统的任务是防止。

您可以使用操作系统的 API “杀死”其他进程。但是您首先必须将其识别为持有给定资源的锁的人——这将是另一个问题的主题。

于 2019-06-13T21:19:00.067 回答