Невозможно прочитать последовательные данные с Arduino и беспроводного модема из-за случая открытия последовательного порта - PullRequest
0 голосов
/ 11 января 2019

Ранее я опубликовал сложный вопрос, похожий на этот, но гораздо более простым способом. Основная проблема - всякий раз, когда я выбираю порт из выпадающего меню и пытаюсь открыть его для чтения данных с 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

Пожалуйста, подскажите, кто поможет мне сделать эту работу, Ваши выводы окажут мне большую помощь.

1 Ответ

0 голосов
/ 11 января 2019

В вашем коде 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()
...