【问题标题】:Python: Testing Serial Ports for AnswerPython:测试串行端口以获得答案
【发布时间】:2026-02-20 22:35:01
【问题描述】:

我正在尝试构建一个简短的代码来测试所有串行 COM 端口(我在 Windows 上)以进行回复。例如,我在 COM3 上连接了一个 Arduino,当它连接时,它会发送一条串行消息。

我希望当我运行 python 脚本时,它会自动检测使用哪个 COM 端口。

我有列出所有端口的功能,但我无法测试所有端口并检测 arduino 连接的位置。

Python:

import serial
import time
import _winreg as winreg
import itertools
import datetime

def enumerate_serial_ports():
    """ Uses the Win32 registry to return an
        iterator of serial (COM) ports
        existing on this computer.
    """
    path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'
    try:
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
    except WindowsError:
        raise IterationError

    for i in itertools.count():
        try:
            val = winreg.EnumValue(key, i)
            yield str(val[1])
        except EnvironmentError:
            break

connected = False

for porta in enumerate_serial_ports():
    print "TRYING PORT: " + porta
    start = datetime.datetime.now()
    delta=0
    ser = serial.Serial(porta,9600,timeout=0)
    if ser.isOpen():
        while ser.isOpen() and delta < 1:
            delta = (datetime.datetime.now()-start).seconds
            r = ser.read()
            if r == None:
                print "connected!"

Arduino 代码

void setup(){
  // Open serial connection.
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  Serial.write(6); 
}

void loop(){ 

} 

谢谢!!

【问题讨论】:

    标签: python serial-port arduino


    【解决方案1】:

    这是一个常见的问题,因为串行端口没有“连接”。如您所见,当您打开()一个串行端口时,这与电线的另一端是否插入了某些东西无关。所有 open() 调用都在为该机器内的串行端口硬件建立句柄。 open() 不保证电缆的另一端。

    “连接”的概念是您必须创造的。连接通常是通过两个设备之间的某种协议握手来创建的,这两个设备之间建立了他们正在与他们期望的人交谈。

    两种通用方法是:

    • 探测并检查响应
    • 收听信标

    我在这个相关问题中警告说,在未知设备上推送字节的第一种方法不是最安全的方法:

    Related question

    您选择了 Python 端被动侦听信标的第二种方法。您需要与此类似的东西,您会收到一些预定义的消息并在收到时做出响应:

    // loop for a short time listening for a *
    if r != None:
        if r.endswith("*"):
            ser.write("I_hear_you")
            print "connected"
    

    Arduino 端启动并广播信标。它会继续广播,直到有人回答为止

    beaconmode = True;
    
    void loop() {
       if (beaconmode) {
         delay(1000);
         Serial.write("*");
         // Serial.read() and check for "I_hear_you"
         if (someone heard my beacon) {
           beaconmode = false;
           // now the two devices are "connected"
           connectedmode = true;
       }
       if (connectedmode) {
         // do normal stuff
       }
    }
    

    如果您想变得更加健壮,可以将这种握手扩展一步。事实上,它只证实了 Python 方面听到了 Arduino 方面的声音。添加的步骤是让 Arduino 通过发送“我听说你听到我”来确认。然后你会得到类似于 3 次握手用来建立 TCP 连接的东西。 .

    【讨论】:

      最近更新 更多