Найти - Пользователи
Полная версия: Периодическое считывание данных с COM порта с помощью signal?
Начало » Python для новичков » Периодическое считывание данных с COM порта с помощью signal?
1 2
romario82
Всем здравствуйте!
Написал я небольшую программку для работы с COM портом.
import serial
import os
from tkinter import *
class okno():
     def __init__ (self):
          global dat
          dat = StringVar()
          lab1 = Label(root, text = t, font="Arial 22",)
          lab2 = Label(root, text = "Температура", font="Arial 18",)
          but = Button(root, text="SEND", width=8, height=5)
          ent = Entry(root,textvariable = dat, width=20, bd=3)
          lab1.grid(row=0, column=0)
          lab2.grid(row=1, column=0)
          but.grid(row=0, column=1)
          ent.grid(row=1, column=1)
          but.bind("<Button-1>", self.send)
          ent["textvariable"] = dat
         
     def send (self, event):
          dat1 = str(dat.get())
          print (dat1)
          ser = serial.Serial('COM1', 9600)
          data = (bytes(dat1, encoding='ascii'))
          ser.write (data)
          
     def temp ():
          ser = serial.Serial('COM1', 9600)
          s=str(ser.readline())
          s=s[2:5]     
          return s
t = okno.temp()    
root = Tk()
root.title("Terminal")
root.geometry('300x200')
root.maxsize(300, 200)
obj = okno()

Как с помощью signal можно организовать периодическое считывание с порта и отображать изменение в lab1 = Label(root, text = t, font=“Arial 22”,)?
noob_saibot
1. Вам устройство вообще что либо отвечает?
2.
from Tkinter import *
import time
def tick():
    label.after(200, tick)
    label['text'] = time.strftime('%H:%M:%S')
root=Tk()
label = Label(font='sans 20')
label.pack()
label.after_idle(tick)
root.mainloop()
взято из вики.
Полезная ссылка!
PS. не тот пример вначале приложил
romario82
Отвечает! Через каждые 10 секунд с устройства приходят данные о измерянной температуре. Программа считывает только первое значение и порт закрывается. Соответственно данные больше не считываются, только перезапуск программы. Мне нужно организовать постоянное считывание данных с порта, в этом и прошу помочь.
py.user.next
romario82
Как с помощью signal можно организовать периодическое считывание с порта и отображать изменение в lab1

вообще, надо менять значение StringVar, подключённой к метке
то есть там не t должно быть, а StringVar (как с Entry сделано)

ты это просто без порта сделай, с простыми строками и таймером

romario82
Программа считывает только первое значение и порт закрывается. Соответственно данные больше не считываются, только перезапуск программы.
а это проверь в консоли, надо в цикле вызывать .readline() и выводить

когда по отдельности всё сделаешь, тогда и соединять можно
romario82
Перепробывал всё вышеперечисленное, всёравно порт после первого считывания данных закрывается …
Shaman
Никогда не использовал питоновский serial. Бросается в глаза создание объекта контроля на каждую операцию и отсутствие его явной финализации. Может быть стоит копать туда.
4kpt_II
Где-то на форуме была тема про чтение данных с COM порта. Поищите. Точно помню, что была. Сделал в памяти себе заметку, что есть решение. Думал пригодиться.
JOHN_16
romario82
если периодичность 10 секунд, то не зазорно каждый раз открывать и закрывать порт.
Но вообще я не увидел причин по которым порт сам должен закрываться. М.б. у вас на стороне устройство какие то проблемы? попробуйте открывать и закрывать порт и отпишитесь о результате.
romario82
Так видимо пакет serial работает, предал данные - порт закрылся, получил данные - порт закрылся. У меня на компе Free Serial Port Monitor установллен. Поэтому я всё вижу, что у меня на порте происходит:
—————————————————————-
Порт открыт процессом “pythonw.exe” (PID: 3808)

2B 32 34 0A +24.

Порт закрыт
—————————————————————
Подобная тема была поднята в http://python.su/forum/topic/6864/, здесь POLL решил подобную проблему с помощью signal.
Сижу разбираюсь…
Или есть другой способ в PYTHON переодически или постоянно вызывать функцию?
4kpt_II
Если GUI Tkinter, то там немножко специфично с периодическими вызовами. Если использовать time.sllep() то интерфейс подвисает. Избежать этого можно выполняя рекурсивно метод .after(). Если по этой схеме будут вопросы - пишите.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB