Python 由于串行端口打开,无法从arduino和无线调制解调器读取串行数据

Python 由于串行端口打开,无法从arduino和无线调制解调器读取串行数据,python,python-3.x,serial-port,pyserial,Python,Python 3.x,Serial Port,Pyserial,我在早些时候发布了一些类似于此的复杂问题,但方式要简单得多。 主要问题是每当我从下拉菜单中选择端口并试图打开它以从Arduino或无线调制解调器读取数据时 每次我都要面对串口未打开的错误 我正在修复COM端口的硬代码工作得非常好 下面提到的是我简化并尝试使用的代码 import serial import serial.tools.list_ports from tkinter import * ard = serial.Serial(); ard.baudrate = 9600 maste

我在早些时候发布了一些类似于此的复杂问题,但方式要简单得多。 主要问题是每当我从下拉菜单中选择端口并试图打开它以从Arduino或无线调制解调器读取数据时

每次我都要面对串口未打开的错误

我正在修复COM端口的硬代码工作得非常好

下面提到的是我简化并尝试使用的代码

import serial
import serial.tools.list_ports
from tkinter import *

ard = serial.Serial();
ard.baudrate = 9600

master = Tk()

variable = StringVar(master)

a=serial.tools.list_ports.comports()
for w in a: 
    print(w.device)
dev = [w.device]
print(dev)
variable.set(dev[0]) # default value
w = OptionMenu(master, variable, *dev)
w.pack()
ard.port = str(w)
ard.open
ard.is_open
#print(k)

def ok():
    print (variable.get())
    k = ard.readline()

button = Button(master, text="OK", command=ok)
button.pack()

mainloop()
但每次我都面临着错误

COM4
['COM4']
COM4
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Misha\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "C:\Users\Misha\Desktop\test\autoserial.py", line 27, in ok
    k = ard.readline()
  File "C:\Users\Misha\AppData\Local\Programs\Python\Python36\lib\site-packages\serial\serialwin32.py", line 267, in read
    raise portNotOpenError
serial.serialutil.SerialException: Attempting to use a port that is not open

请建议帮助我完成这项工作,您的线索将对我有很大帮助。

您的代码中有
ard.open
,但实际上您并没有调用该方法来打开串行连接。这就是为什么您在尝试使用未打开的端口时出现错误,提示
。请尝试
ard.open()
以查看这是否有效。这将打开您的端口并使其可用

但是,根据您的设置,您可能希望将其包装为一个回调,您可以将其绑定到另一个按钮或
选项菜单
。似乎您希望能够灵活地选择端口,并且只在选择一个端口后才打开端口

下面是一个小例子,它可能看起来像什么:

import tkinter as tk
import serial
import serial.tools.list_ports

ard = serial.Serial();
ard.baudrate = 9600

a = serial.tools.list_ports.comports()
ports = [port.device for port in a]

def open_serial():
    ard.port = variable.get()
    ard.open()
    print(f'Port {variable.get()} opened')

def close_serial():
    p = ard.port
    ard.close()
    print(f'Port {p} closed')

master = tk.Tk()
variable = tk.StringVar()
variable.set(ports[0])
options = tk.OptionMenu(master, variable, *ports)
options.pack()
button_open = tk.Button(master, text='Open', command=open_serial)
button_open.pack()
button_close = tk.Button(master, text='Close', command=close_serial)
button_close.pack()

tk.mainloop()

使用ard.port()后,错误是:回溯(最近一次调用):文件“C:\Users\Misha\Desktop\test\autoserial.py”,在ard.open()文件“C:\Users\Misha\AppData\Local\Programs\Python\Python36\lib\site packages\serial\serialwin32.py”的第21行,在open raise SerialException(“无法打开端口{!r}:{!r}”。格式中(self.portstr,ctypes.WinError())serial.serialutil.SerialException:无法打开端口“”!optionmenu”:FileNotFoundError(2,“系统找不到指定的文件“”,无,2)是的,我想在选择任何端口后选择端口并打开端口。我想你应该尝试我在第二段中提出的建议,而不是在
ard.open
后面加括号。你想能够控制何时打开端口,特别是在你选择了要打开的端口之后。我想再添加一个,但吨打开端口是一个很好的路线。实际上,我是新的Python和我正在桌面应用程序。你能给我一些样品,帮助我修改我的代码相应?太好了!因为这是有益的,请考虑。