基于Python查看TNT Go有线版串口数据以及屏幕电量

前段时间由于出差,购入一台TNT Go有线版做便携屏使用,相较于无限版和工程版,功能上要少了很多,当然价格也会低一些,在使用中基本上没有遇到什么问题

目录

问题描述

解决思路

解决方法

串口软件llcom读取电量

Python程序读取电量

设计GUI界面


问题描述

没有锤子手机的话,无法查看屏幕的电量

解决思路

既然连接手机能够查看电量,那就说明串口信息中可以读取到,应该是ADB指令就可以

解决方法

借助开源串口软件llcom进行测试,需要下载的话请访问GitHub:GitHub - chenxuuu/llcom: 🛠功能强大的串口工具。支持Lua自动化处理、串口调试、串口监听、串口曲线、TCP测试、MQTT测试、编码转换、乱码恢复等功能

串口软件llcom读取电量

在串口软件中,看到软件已经识别到串口号(我这里是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程序读取电量

为了实时显示通过串口接收到的屏幕电量信息,我们可以使用Pythonserial库来读取串口数据,并使用正则表达式来解析电量信息。首先,确保你已经安装了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<percentage>\d+),', data_str)
        if match:
            # 获取电量百分比
            percentage = match.group('percentage')
            print(f"当前电量:{percentage}%")
    
    # 每秒读取一次
    time.sleep(1)

# 关闭串口
ser.close()

请注意,这段代码需要在你的电脑上运行,并且你的便携屏需要通过Type-C连接到电脑,并正确设置为COM3串口。此外,根据你的实际情况,可能需要调整串口号、波特率或发送的指令。

在运行此程序之前,请确保你的电脑上安装了Python环境,并且已经安装了pyserial库。如果你的串口号不是COM3,或者波特率有所不同,请根据实际情况对程序中的相应部分进行修改。

设计GUI界面

这样还是不直观,使用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<percentage>\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()

 运行后,效果还算可以

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sagima_sdu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值