Python - 从称重小部件发送恒定串行数据
你好,我是这个论坛和编程的新手。我有一个项目,需要每秒把tkinter的滑块值通过串口发送出去。我一直在为这个问题抓头发,找不到解决办法。任何建议都非常感谢。谢谢 :-)
补充说明 - 当我运行下面的代码时,出现了一个tkinter窗口,里面有滑块,但当我移动滑块时,数据并没有通过串口发送出去。
import serial
from tkinter import *
mGui = Tk ()
mGui.geometry(500x250)
ser = serial.Serial(,'/dev/ttyUSB0',9600)
def scale1():
ser.write(s.get)
s=Scale (mGui, from_=0, to=100, orient=HORIZONTAL, command=scale1)
s.pack()
1 个回答
0
你想要的是一种异步或多线程的生产者/消费者模式。简单来说,就是需要定期检查串口,看看有没有新数据进来,同时也要定期把数据写出去。
你可以参考标准库中的队列模块,来实现这个功能。你可以轻松地修改它,让当Scale()的值变化时,把新值放进队列里,然后再开一个专门的线程来读取新数据(如果有的话)或者把队列里的值写入串口。
不过,如果你快速移动Scale控制器,可能会遇到一个问题:队列里的值会比你能及时写入的还要多。
如果真是这样,你可以考虑完全跳过队列,直接让串口的读写操作每隔一段时间(比如0.02秒)就写入Scale()的当前值。这个时间间隔可能是你能做到的最小值,但如果你真的在以9600波特率连接,就要调整写入的时间间隔,确保不会写入超过串口缓冲区能处理的量。
def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.daemon = True
t.start()
for item in source():
q.put(item)
q.join() # block until all tasks are done