You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用.after()时serial.readline()无法更新Arduino电压值

问题分析与解决方案

核心问题

你遇到的现象根源在于Tkinter after() 方法的调用方式错误:

  • 初始化时你写了 tkTop.after(2000, read_analog()),这里的read_analog()会被立即执行,函数返回的None被传给after(),导致后续没有定时触发新的读取操作。第一次读取的有效值会被重复打印,因为没有新的串口读取动作。
  • 而如果在after()里用read_analog(),相当于每次执行函数时立刻递归调用自己,虽然能持续读取串口,但会阻塞Tkinter的事件循环,导致其他硬件控制按钮响应异常。

修复步骤

1. 修正after()的调用方式

把初始化时的代码:

tkTop.after( 2000, read_analog())

改成:

tkTop.after(2000, read_analog)

(去掉函数名后的括号,传递函数对象而非函数执行结果)

2. 优化串口读取逻辑

添加空值判断,避免打印空内容(因为serial.readline()在超时后会返回空):

def read_analog():
    value = ser.readline().decode().strip()  # 用strip()统一去除换行符和空格
    if value:  # 仅当读取到有效数据时打印
        print('Voltage', value, ' volts')
    tkTop.after(2000, read_analog)  # 定时触发下一次读取

额外注意事项

  • 确认Arduino端代码是持续循环输出最新的模拟电压值,而非仅发送一次数据。
  • 串口波特率(9600)需与Arduino端设置一致,避免数据乱码。

内容的提问来源于stack exchange,提问作者lwadz88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:58:10