仅当终端应用程序在后台打开时,使用 pyserial 从串行端口读取才有效

Posted

技术标签:

【中文标题】仅当终端应用程序在后台打开时,使用 pyserial 从串行端口读取才有效【英文标题】:Reading from serial port with pyserial only works if terminal app is open in background 【发布时间】:2015-11-26 21:23:33 【问题描述】:

我正在使用 pyserial 通过基于 FTDI 的 usb-to-rs232 适配器(使用 Mac OS X 内置驱动程序)与我的万用表 (Keithley2000) 进行通信。

在开始使用 Pyserial 之前,我通过使用终端应用程序 (Serial.app) 与万用表通信来验证硬件和驱动程序是否正常工作。 这很好用。

但是如果我用下面的简单程序尝试同样的事情,它就行不通了。 写作工作正常(例如我可以重置仪器),但我无法读回任何内容。

import serial
import io

port = serial.Serial("/dev/cu.usbserial-FT8VXG35", 9600, timeout=1)
port.write("*idn?\r")
print(port.readline())

现在奇怪的部分来了。如果我让 Serial.app 在书房后台打开,该程序实际上可以工作。

有人知道这种行为的原因吗?

这是我在 Serial.app 中的设置

【问题讨论】:

RS232 具有所谓的流控制线(RTS/CTS、DSR/DTR,还有其他一些,取决于您的 USBRS232 设备实现的内容)以及 rx/tx 数据线。一些外围设备会注意这些,并在传输之前需要它们在特定级别。也许在后台打开 serial.app 会将这些行设置为万用表可接受的值?没看过,python串口模块让你控制流控线吗? 您是否尝试过python串行终端应用程序,如果可行,您可以在端口上进行相同的设置吗? 两个很好的建议。我尝试了 minterm.py (它是 pyserial 的一部分),起初它也不起作用,所以我玩弄了 RTS 和 DTR。强制 RTS 降低似乎可以解决问题。在上面的代码中添加port.setRTS(False),它就可以工作了。 :-) 希望你能接受我的回答。 【参考方案1】:

某些外围设备需要将流控制线(RTC/CTS、DSR/DTR)设置为特定级别 - 也许让 serial.app 运行后台以您的万用表需要的方式设置这些线?

【讨论】:

以上是关于仅当终端应用程序在后台打开时,使用 pyserial 从串行端口读取才有效的主要内容,如果未能解决你的问题,请参考以下文章

在联系人活动打开时进入后台时退出应用程序

如何在RubyMine中打开时更改终端字体?

相机打开时如何释放相机?

Linux 让程序在后台执行

通过单击应用程序图标(来自后台)打开时反应本机android应用程序重新启动

HKObserverQuery 仅在应用程序重新打开时运行