5

这个问题的解决方案可能很简单,但我是动态与设备交互的新手。我正在做的是我正在制作一个 python 可执行代码,所以用户不必在他们的计算机上或任何类型的 python 解释器上有空闲,这意味着我不知道设备将插入哪个 USB 端口到。该程序需要能够打开与通过串行到 USB 转换器连接的设备的连接。如何确定哪个连接的设备是打开端口的正确设备?我正在使用 pySerial 与设备进行交互。任何帮助将不胜感激。

4

3 回答 3

7

无论您如何配置您的设备,在某些时候您可能不得不询问用户端口在哪里,或者轮询所有串行设备以获得已知响应。(虽然投票有它的陷阱,所以请继续阅读!)。与 USB 设备不同,当您连接普通的旧串行设备时,操作系统不会知道供应商/设备 ID。

首先,您需要找到串行端口。这里有一个问题可能会有所帮助:Python 中枚举串行端口(包括虚拟端口)的跨平台方法是什么?.

获得串行端口列表后,您可以询问用户是否知道要使用哪一个。如果他们这样做,问题就解决了!

如果他们不这样做,您可以提议使用一些数据轮询所有串行设备,您知道这些数据会从您的设备产生特定响应。请记住,如果用户连接了其他串行设备,您的“hello”字节字符串实际上可能是其他设备的自毁序列!因此,您应该警告用户轮询可能会干扰其他设备,并始终在您这样做之前提示他们。

如果不了解您的代码的更多信息(例如,您正在使用什么通信框架,如果有的话;您是在控制台中执行此操作还是使用 GUI 工具包等),不可能说出编写此代码的最佳方式可能。在最简单的情况下,您可以遍历所有串行设备,发送问候语并检查响应。(您也可以并行执行此操作:为问候语循环一次,然后再次循环以检查缓冲区中的内容。如果您想要比这更花哨,请使用适当的库。)


旁注:如果您有一个可以为其设置供应商/设备 ID 的内置转换器,您也许可以解决这个问题,但任何现代操作系统仍会自动检测到该转换器并将其枚举为串行端口;您将无法直接将其作为 USB 设备与之对话。可以确定哪个端口与哪个 ID 对应,但我从未尝试过这样做。但是,如果您不是选择转换器的人(例如,如果它是用户提供的电缆),则这种方法是无用的。

于 2012-08-01T01:27:44.017 回答
3

这是我用来识别像 Arduino 这样的串行 USB 转换器设备的方式。它检查设备描述的“USB”字符串。

import serial as ser
import serial.tools.list_ports as prtlst

global COMs
COMs=[]
def getCOMs():
    global COMs
    pts= prtlst.comports()

    for pt in pts:
        if 'USB' in pt[1]: #check 'USB' string in device description
            COMs.append(pt[0])
于 2016-12-17T15:51:01.737 回答
0

我认为解决探测未知设备问题的唯一方法是让设备不断发送未经请求的“你好”响应。那就是您可以连接到所有串行设备并收听“你好”。连接和收听串行设备不应该把它搞砸。

缺点是这些消息会使串行流混乱。你可以有一个“我现在在这里,stfu”命令,但你只能连接一次。

FTDI 芯片有一种识别方法,但您必须使用它们的库来访问数据。

于 2014-07-08T15:10:49.000 回答