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

Python程序可打印日期时间,但无法向USB串口16*2 LCD写入数据求助

解决串口写入datetime对象的报错问题

嘿,作为Python新手碰到这个问题太正常啦,咱们一步步拆解解决:

核心错误原因

你代码里的ser.write(now)会报错,本质原因是串口的write()方法只能接收字节(bytes)类型的数据,但now是datetime.datetime类的对象,Python完全不知道该怎么把这个对象转换成串口能识别的信号~

分步修复代码

1. 修复串口写入的核心问题

把datetime对象先转成人类可读的字符串,再编码成字节串(比如用UTF-8编码),就能被串口正常接收了。另外考虑到16*2 LCD的显示空间有限,咱们可以把日期时间格式化成更紧凑的样式,比如YYYY-MM-DD HH:MM:SS,刚好适配屏幕宽度。

2. 修复无用的getdatetime函数

你现在的getdatetime函数完全没发挥作用:内部用了==做比较而非赋值,也没把生成的日期字符串返回。咱们把它改成一个能返回格式化日期字符串的工具函数,让代码更整洁复用。

3. 优化循环与收尾逻辑

原来的循环里重复获取时间的代码可以简化,而且os.system('clear')是清你的终端屏幕,不是清LCD——如果要清LCD,需要给串口发送对应的指令(比如大多数LCD模块的清屏指令是b'\x0C',你可以根据Midas板的文档调整)。另外加上捕获Ctrl+C的逻辑,能优雅关闭串口,避免设备占用。

修改后的完整代码

import usb.core
import usb.util
import os
import datetime
import time
import serial

def getdatetime(timedateformat='complete'):
    # 修复函数:返回格式化后的日期时间字符串
    now = datetime.datetime.now()
    if timedateformat.lower() == 'complete':
        # 格式化为适合16*2 LCD的紧凑样式
        return now.strftime("%Y-%m-%d %H:%M:%S")
    # 可扩展其他格式,比如只返回时间
    elif timedateformat.lower() == 'time':
        return now.strftime("%H:%M:%S")
    else:
        return str(now)

# 初始化串口,给设备留启动时间
ser = serial.Serial('/dev/ttyACM0', 9600)
time.sleep(0.5)

try:
    while True:
        # 获取格式化后的日期时间字符串
        current_time_str = getdatetime('complete')
        print(current_time_str)  # 终端打印调试
        # 转成字节串后写入串口
        ser.write(current_time_str.encode('utf-8'))
        # 可选:发送LCD清屏指令(根据你的Midas板调整)
        # ser.write(b'\x0C')
        # 清终端屏幕
        os.system('clear')
        time.sleep(1)
except KeyboardInterrupt:
    # 捕获Ctrl+C,优雅关闭串口
    ser.close()
    print("程序已退出")

额外注意点

  • 如果LCD显示乱码,先确认串口波特率和你的Midas板设置完全匹配(比如是不是9600)。
  • 部分LCD模块需要先发送初始化指令(比如设置显示模式、光标位置)才能正常显示,你可以参考Midas USB板的官方文档添加对应的初始化代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:14:42