【问题标题】:Pyserial code to connect peripheral device to PC automatically when using USB- Serial cable使用 USB 串行电缆时自动将外围设备连接到 PC 的 Pyserial 代码
【发布时间】:2013-09-23 07:37:52
【问题描述】:

我有一个外围设备(比如带有微控制器的硬件电路)。我必须通过串行通信向这个外围设备输入一些命令。这些命令嵌入到 python 脚本中。 我正在使用 USB 串行电缆将外围设备连接到 PC。 现在我必须在pyserial中编写代码,以便PC会自动检测连接外围设备的com端口并成功连接设备与PC。(可以环回)

目前我在 Pyserial 中使用以下代码。我已经明确提到 Peripheral 在 COM1 上连接到 PC ---

try: 
        self.ser = serial.Serial(0)
        #self.ser.port='/dev/ttyS1'
        self.ser.baudrate = 9600
        self.ser.bytesize = serial.EIGHTBITS 
        self.ser.parity = serial.PARITY_NONE 
        self.ser.stopbits = serial.STOPBITS_ONE 
        self.ser.timeout = 1            
        self.ser.xonxoff = False     #disable software flow control
        self.ser.rtscts = False     #disable hardware (RTS/CTS) flow control
        self.ser.dsrdtr = False       #disable hardware (DSR/DTR) flow control
        self.ser.writeTimeout = 2     #timeout for write
    except Exception, e:
        print "error open serial port: " + str(e)

请告诉我如何自动检测 COM 端口并在之后连接?

【问题讨论】:

    标签: python device-driver pyserial


    【解决方案1】:

    这是一个常见问题,可以通过检查外围设备的特定返回代码(通常是标识字符串)来解决。这是一个使用 pyserial 的示例:

    from serial.tools import list_ports
    
    def locate_port():
        """Attempt to locate the serial port to which the device
        is connected."""
    
        status_request_string = 'OI;'  # Output information
        expected_response = 'DISPENSEMATE'
    
        device_port = None
        for port_name, port_desc, hw_id in list_ports.comports():
            with serial.Serial(port=port_name, **device_serial_settings) as ser:
                ser.write(status_request_string)
                if ser.readline().startswith(expected_response):
                    device_port = port_name
                    break
        if not device_port:
            raise UserWarning('Could not find a serial port belonging to '
                'the asymtek dispensemate.')
        return device_port
    

    通常,您正在与之通信的设备的手册至少有一个命令不会更改设备的状态,而只是回显您的最后一行或返回其配置、硬件 ROM 版本或仅返回其名称。正是这个响应(以及请求它的命令),您需要分别填写expected_responsestatus_request_stringdevice_serial_settings 是一个字典,包含波特率和奇偶校验位等参数;正确连接到设备所需的一切,除了它的名称。 如您所见,上面的代码是为 Asymtek Dispensemate 编写的(也是旧的,因此难以获得支持)。

    如果您调用该函数,您可以使用它的返回值来简单地连接到设备:

    port = locate_port()
    my_device = serial.Serial(port, **device_serial_settings)
    

    但有一个警告:如果计算机连接到多个都通电的串行设备,则您可能会向其他设备发送非法命令。在最好的情况下,它们只是简单地回复一个错误代码,它们的状态不会受到影响,但该命令也可以对这些设备进行更改,因此请检查所有其他外围设备的“允许的操作码”字典。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 2022-12-22
      • 2013-09-20
      • 1970-01-01
      • 2018-05-24
      • 2023-03-04
      相关资源
      最近更新 更多