Python - 从称重小部件发送恒定串行数据

1 投票
1 回答
589 浏览
提问于 2025-04-19 11:07

你好,我是这个论坛和编程的新手。我有一个项目,需要每秒把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

撰写回答