前段时间由于出差,购入一台TNT Go有线版做便携屏使用,相较于无限版和工程版,功能上要少了很多,当然价格也会低一些,在使用中基本上没有遇到什么问题
目录
问题描述
解决思路
解决方法
串口软件llcom读取电量
Python程序读取电量
设计GUI界面
没有锤子手机的话,无法查看屏幕的电量
既然连接手机能够查看电量,那就说明串口信息中可以读取到,应该是ADB指令就可以
借助开源串口软件llcom进行测试,需要下载的话请访问GitHub:GitHub - chenxuuu/llcom: 功能强大的串口工具。支持Lua自动化处理、串口调试、串口监听、串口曲线、TCP测试、MQTT测试、编码转换、乱码恢复等功能
在串口软件中,看到软件已经识别到串口号(我这里是COM3),直接向其发送指令
at+adb
观察返回值,能够看到格式基本上是
[2024/02/04 16:45:53.799] → +BATCG=3855,60,2,-929,275,2␍␊
+HRM=0,276,1004␍␊
HEX:2B 42 41 54 43 47 3D 33 38 35 35 2C 36 30 2C 32 2C 2D 39 32 39 2C 32 37 35 2C 32 0D 0A 2B 48 52 4D 3D 30 2C 32 37 36 2C 31 30 30 34 0D 0A
在+BATCG=后面的第二个数字即为屏幕电池的剩余电量,这里显示的60,也就是当前电量为60%
为了实时显示通过串口接收到的屏幕电量信息,我们可以使用Python的serial库来读取串口数据,并使用正则表达式来解析电量信息。首先,确保你已经安装了pyserial库,如果没有安装,可以通过运行下面指令来安装
pip install pyserial
下面是一个示例Python程序,它会打开COM3串口,设置波特率为115200,然后不断读取串口数据,并解析出电量信息:
import serial
import re
import time
# 打开串口
ser = serial.Serial('COM3', 115200, timeout=0.1)
# 向屏幕发送指令
ser.write(b'at+adb\r\n')
while True:
# 读取串口数据
data = ser.readline()
if data:
# 将byte数据转换为字符串
data_str = data.decode('utf-8')
# 使用正则表达式匹配电量信息
match = re.search(r'\+BATCG=\d+,(?P\d+),', data_str)
if match:
# 获取电量百分比
percentage = match.group('percentage')
print(f"当前电量:{percentage}%")
# 每秒读取一次
time.sleep(1)
# 关闭串口
ser.close()
请注意,这段代码需要在你的电脑上运行,并且你的便携屏需要通过Type-C连接到电脑,并正确设置为COM3串口。此外,根据你的实际情况,可能需要调整串口号、波特率或发送的指令。
在运行此程序之前,请确保你的电脑上安装了Python环境,并且已经安装了pyserial库。如果你的串口号不是COM3,或者波特率有所不同,请根据实际情况对程序中的相应部分进行修改。
这样还是不直观,使用tkinter库设计GUI界面:
import tkinter as tk
from tkinter import ttk
import serial
import threading
import re
class BatteryMonitorApp:
def __init__(self, root):
self.root = root
self.serial_port = None
self.running = False
self.root.title("电量监控")
# 串口选择
tk.Label(root, text="串口号:").grid(row=0, column=0)
self.port = ttk.Combobox(root, values=[f'COM{i}' for i in range(1, 11)])
self.port.grid(row=0, column=1)
self.port.current(0)
# 波特率选择
tk.Label(root, text="波特率:").grid(row=1, column=0)
self.baudrate = ttk.Combobox(root, values=[9600, 19200, 38400, 57600, 115200])
self.baudrate.grid(row=1, column=1)
self.baudrate.current(4)
# 控制按钮
self.start_button = tk.Button(root, text="开始", command=self.start_reading)
self.start_button.grid(row=2, column=0)
self.stop_button = tk.Button(root, text="停止", command=self.stop_reading, state=tk.DISABLED)
self.stop_button.grid(row=2, column=1)
# 电量显示
self.battery_label = tk.Label(root, text="当前电量: --%", font=("Helvetica", 16))
self.battery_label.grid(row=3, column=0, columnspan=2)
# 串口数据显示
self.text_area = tk.Text(root, height=10, state=tk.DISABLED)
self.text_area.grid(row=4, column=0, columnspan=2)
def start_reading(self):
if not self.running:
self.running = True
self.start_button.config(state=tk.DISABLED)
self.stop_button.config(state=tk.NORMAL)
self.thread = threading.Thread(target=self.read_serial)
self.thread.start()
def stop_reading(self):
if self.running:
self.running = False
self.thread.join()
self.start_button.config(state=tk.NORMAL)
self.stop_button.config(state=tk.DISABLED)
def read_serial(self):
try:
self.serial_port = serial.Serial(self.port.get(), self.baudrate.get(), timeout=0.1)
self.serial_port.write(b'at+adb\r\n')
while self.running:
data = self.serial_port.readline()
if data:
self.display_data(data.decode())
self.update_battery_status(data.decode())
except Exception as e:
self.display_data(str(e))
finally:
if self.serial_port:
self.serial_port.close()
def display_data(self, data):
self.text_area.config(state=tk.NORMAL)
self.text_area.insert(tk.END, data)
self.text_area.see(tk.END)
self.text_area.config(state=tk.DISABLED)
def update_battery_status(self, data):
match = re.search(r'\+BATCG=\d+,(?P\d+),', data)
if match:
percentage = match.group('percentage')
self.battery_label.config(text=f"当前电量: {percentage}%")
if __name__ == "__main__":
root = tk.Tk()
app = BatteryMonitorApp(root)
root.mainloop()
运行后,效果还算可以