由于串行端口打开情况,无法从 arduino 和无线调制解调器读取串行数据
Not able to Read serial data from arduino and wireless modem due serial port opening case
我之前发布过一些与此类似但更简单的复杂问题。
主要问题是每当我从下拉菜单中选择端口并尝试打开它以从 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
,但您实际上并没有调用该方法来打开串行连接。这就是为什么您会收到一条错误消息 Attempting to use a port that is not open
。尝试 ard.open()
看看是否可行。这应该会打开您的端口并使其可用。
但是,根据您的设置,您可能希望将其包装在一个可以绑定到另一个按钮或 OptionMenu
的回调中。看来你会希望灵活选择端口,选择一个端口后才打开。
这是一个可能看起来像的小例子:
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()
我之前发布过一些与此类似但更简单的复杂问题。 主要问题是每当我从下拉菜单中选择端口并尝试打开它以从 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
,但您实际上并没有调用该方法来打开串行连接。这就是为什么您会收到一条错误消息 Attempting to use a port that is not open
。尝试 ard.open()
看看是否可行。这应该会打开您的端口并使其可用。
但是,根据您的设置,您可能希望将其包装在一个可以绑定到另一个按钮或 OptionMenu
的回调中。看来你会希望灵活选择端口,选择一个端口后才打开。
这是一个可能看起来像的小例子:
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()