You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
2.4 KiB
Python

2 years ago
import serial
import struct
# 定义电池状态常量
BATSTATE_CHARGE_COMPLETE = 0x01
BATSTATE_CHARGE_NOW = 0x02
BATSTATE_CHARGE_LEARN = 0x10
BATSTATE_DISCHAR_NOW = 0x04
# 定义TagResult结构体对应的Python类
class TagResult:
def __init__(self, data):
fmt = '<hhiHHBB4x' # 小端序little-endian对应INT16、INT16、INT16、UINT16、UINT16、UINT8、UINT8和4个字节的预留空间
temp, current, volt, remaintime, capacity, cappercent, state, *_ = struct.unpack(fmt, data)
self.temp = temp / 10 if temp > -3276.8 else float('nan') # 假设温度值需要除以10得到实际℃数
self.current = current # mA
self.volt = volt # mV
self.remaintime = remaintime # 分钟
self.capacity = capacity # mAH
self.cappercent = cappercent # 百分比%
self.state = state # 充放电状态
@property
def chargingStatus(self):
statusString = ""
if self.state & BATSTATE_DISCHAR_NOW:
statusString = f"剩余使用时间约:{self.remaintime}分钟"
if self.state & BATSTATE_CHARGE_LEARN:
statusString += ",现在插入充电器可执行充电校准"
elif (self.state & BATSTATE_CHARGE_NOW) or (self.state & BATSTATE_CHARGE_COMPLETE):
if self.state & BATSTATE_CHARGE_NOW:
statusString = "充电中"
else:
statusString = "充电完成"
if self.state & BATSTATE_CHARGE_LEARN:
statusString += ",正在执行充电校准"
return statusString
class BatteryManange():
def __init__(self):
self.port = 'COM2' # 替换为实际的串口号
self.baudRate = 9600
try:
self.ser = serial.Serial(self.port, self.baudRate)
except:
pass
def readBatteryInfo(self):
command = b'\xAA\xFF\x55\xFF\x01\x80\xAA\xEE\x55\xEE'
self.ser.write(command)
response = self.ser.read(26)
# 检查包头和包尾是否正确
if not (response.startswith(b'\xAA\xFF\x55\xFF') and response.endswith(b'\xAA\xEE\x55\xEE')):
raise ValueError("无效的包头或包尾")
contentData = response[4:22]
# 创建TagResult对象并解析电池信息
result = TagResult(contentData)
# print(result.chargingStatus)
return result
def close(self):
1 year ago
pass
# self.ser.close()
2 years ago