pySerial:一次打开多个端口

1 投票
3 回答
5823 浏览
提问于 2025-04-16 20:59

编辑: 找到了问题所在:我在引用一个变量时,搞混了它的名字,所以实际上我声明了一个新的变量。结果发现,pySerial并不限制一次只能打开一个串口。

我想用以下代码同时打开两个串口

    ser0 = serial.Serial(
                         port = port_list[0],
                         baudrate = 115200,
                         timeout = 0.1
                         )

    ser1 = serial.Serial(
                         port = port_list[1],
                         baudrate = 115200,
                         timeout = 0.1
                         )

但似乎我一打开第二个,第一个就关闭了。使用pySerial一次只能打开一个串口吗?

谢谢, T.G.

编辑:我本该一开始就发这个

while not (comm_port0_open and comm_port1_open):
    print 'COM ports available:'
    port_list = []
    i = 0
    for port in __EnumSerialPortsWin32():
        port_list.append(port[0])
        print '%i:' % i, port[0]
        i+=1
    print 'Connect to which port? (0, 1, 2, ...)'
    comm_port_str = sys.stdin.readline()
    try:
        if len(comm_port_str)>0:
            if comm_port0_open:
                ser1 = serial.Serial(
                                    port = port_list[int(comm_port_str)],
                                    baudrate = 115200,
                                    timeout = 0.1
                                    )
                comm1_port_open = True
                print '%s opened' % port_list[int(comm_port_str)]
            else:
                ser0 = serial.Serial(
                                    port = port_list[int(comm_port_str)],
                                    baudrate = 115200,
                                    timeout = 0.1
                                    )
                comm0_port_open = True
                print '%s opened' % port_list[int(comm_port_str)]                   
        else:
            print 'Empty input'
    except:
        print 'Failed to open comm port, try again'

3 个回答

0

在声明打开串口时用到的变量和在while条件中检查的变量不一致。哎呀。

0

在没有看到代码的具体情况之前,这只是个猜测。

串口在被垃圾回收时会关闭,也就是当__del__这个方法被执行的时候。在CPython中,如果你的ser0的引用计数在那段代码执行后降到零,但ser1的引用计数没有降到零,那么就会看起来像是一个串口关闭了,而另一个串口打开了。

不过,记得多发一些代码过来!

0

在你的代码里,你测试了 comm_port0_opencomm_port1_open,但是你设置的是 comm0_port_open = Truecomm1_port_open。名字不一样哦!

还有一点:不要使用光秃秃的 'except',这样会把各种错误都隐藏起来。

撰写回答