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
相关产品推荐
相关产品推荐

