Python读取串口数据插入MySQL无报错但数据未入库问题排查
问题分析与修复方案
我看了你的代码,发现几个关键问题导致数据没能插入数据库,咱们一个个拆解:
1. 变量转换的低级错误
你在转换y和z的时候,居然都用了xs(第一行串口数据),而不是对应的ys和zs!这会导致y和z的值和x完全一致,而且如果第一行数据转换失败,x、y、z都会处于未定义状态,后续执行SQL肯定出问题。
2. 忘记执行数据库提交操作
你写的是conn.commit,但这只是引用了方法对象,没有真正调用它!必须写成conn.commit()才会把插入操作提交到数据库。这应该是最核心的问题——静态值测试时你可能不小心写对了,动态读取时漏了括号。
3. 串口数据未处理空白字符
串口读取的readline()会包含换行符(\n)或者回车符(\r),直接转float/int会触发ValueError,所以转换前必须用strip()去掉这些空白字符。
4. 缺少对v的异常处理
你给v赋值时没有加try-except,如果vs的数据不能转成int,程序会直接崩溃,而不是跳过错误。
5. 不推荐的SQL拼接方式
用%拼接SQL语句存在SQL注入风险,而且格式处理容易出问题,MySQLdb支持参数化查询,用%s作为占位符更安全可靠。
修正后的代码
import MySQLdb import serial import time ser = serial.Serial('/dev/ttyACM0', 115200) conn = MySQLdb.connect(host="localhost", user="JP", passwd="password", db="serialdb") cursor = conn.cursor() try: print "waiting for data" # 读取数据并处理空白字符 xs = ser.readline().strip() print xs time.sleep(1) ys = ser.readline().strip() print ys time.sleep(1) zs = ser.readline().strip() print zs time.sleep(1) vs = ser.readline().strip() print vs time.sleep(1) # 转换变量,带异常处理,默认值可以根据你的需求调整 x = float(xs) if xs.replace('.', '', 1).isdigit() else 0.0 y = float(ys) if ys.replace('.', '', 1).isdigit() else 0.0 z = float(zs) if zs.replace('.', '', 1).isdigit() else 0.0 v = int(vs) if vs.isdigit() else 0 print "inserting into database" # 使用参数化查询,更安全 sql = "INSERT INTO Arduino_Data(Temperature, Humidity, RPM, Distance) VALUES (%s, %s, %s, %s)" cursor.execute(sql, (x, y, z, v)) # 执行提交操作 conn.commit() print "数据插入成功!" except Exception as e: # 捕获所有异常,方便排查问题 print f"出错了: {str(e)}" # 如果出错,回滚操作 conn.rollback() finally: # 关闭游标和连接 cursor.close() conn.close() ser.close()
额外建议
- 可以用日志模块代替print,方便后续排查问题
- 串口读取可以设置超时时间,避免程序一直卡在
readline() - 数据库连接最好用上下文管理器(with语句),自动处理关闭操作
内容的提问来源于stack exchange,提问作者JamesP
相关产品推荐
相关产品推荐

