Python3新手求助:GPS传感器时间戳生成报AttributeError错误
解决GPS时间戳获取的AttributeError问题
嘿,这个错误其实很好定位——你的GPS模块还没成功获取到有效的UTC时间数据,所以gps.timestamp_utc是None对象,自然没法访问tm_mon这类属性啦。下面给你一步步拆解解决思路:
1. 先给代码加个安全检查,避免None报错
在访问timestamp_utc的属性之前,先判断它是否有效,这样能避免崩溃还能给出明确提示:
import time def gpstsRead(): # 先检查GPS是否返回了有效时间 if not gps.timestamp_utc: return "GPS_NO_FIX" # 返回标记,方便后续处理 # 生成适配MySQL的DATETIME格式(YYYY-MM-DD HH:MM:SS) gps_ts = '{:04}-{:02}-{:02} {:02}:{:02}:{:02}'.format( gps.timestamp_utc.tm_year, gps.timestamp_utc.tm_mon, gps.timestamp_utc.tm_mday, gps.timestamp_utc.tm_hour, gps.timestamp_utc.tm_min, gps.timestamp_utc.tm_sec, ) return gps_ts
2. 确保GPS模块完成信号定位
Adafruit GPS模块需要接收到足够的卫星信号才会返回有效时间,在调用gpstsRead()之前,一定要先等模块完成定位:
# 初始化GPS对象后,先等待定位 while not gps.has_fix: gps.update() print("等待GPS定位...") time.sleep(1) # 定位成功后再获取时间戳 gps_ts = gpstsRead()
注:第一次启动GPS模块可能需要3-5分钟(甚至更久),如果在室内信号差的地方,可能需要移到开阔区域测试。
3. 验证GPS模块的基础连接
如果还是拿不到有效时间,先排查模块本身的连接是否正常:
- 确认串口波特率、串口号和模块匹配(Adafruit GPS常用9600或115200波特率)
- 用简单代码测试模块是否输出NMEA数据:
while True: gps.update() # 打印原始NMEA语句,看模块是否在工作 if gps.nmea_sentence: print(gps.nmea_sentence) time.sleep(0.5)
4. 适配MySQL存储的小优化
既然要存到MySQL,建议直接生成YYYY-MM-DD HH:MM:SS格式的字符串(上面代码已经改了),这样可以直接插入数据库的DATETIME类型字段。另外,数据库的插入时间戳可以让MySQL自动处理:
- 给数据库表加一个
insert_time字段,类型设为TIMESTAMP,默认值设为CURRENT_TIMESTAMP,这样插入数据时会自动记录当前时间,不用你手动生成。
内容的提问来源于stack exchange,提问作者Major Hooters
相关产品推荐
相关产品推荐

