优化固件升级

This commit is contained in:
zhangsheng 2025-04-15 14:18:19 +08:00
parent 345de6a942
commit 14066cb7ac

View File

@ -1,6 +1,8 @@
import sys
import socket
import os
from time import sleep
import numpy as np
from scipy.fft import fft, fftfreq
import matplotlib.pyplot as plt
@ -86,8 +88,10 @@ class SocketClientApp(QMainWindow):
self.connect_button = QPushButton("连接")
self.get_data_button = QPushButton("获取数据")
self.upgrade_button = QPushButton("更新固件")
self.upgrade_button_test = QPushButton("更新固件2")
self.get_data_button.setEnabled(False) # 初始状态不可点击
self.upgrade_button.setEnabled(False) # 初始状态不可点击
self.upgrade_button_test.setEnabled(False) # 初始状态不可点击
self.ip_input.setText("192.168.0.200")
self.port_input.setText("12345")
@ -121,6 +125,7 @@ class SocketClientApp(QMainWindow):
button_layout.addWidget(self.connect_button)
button_layout.addWidget(self.get_data_button)
button_layout.addWidget(self.upgrade_button)
button_layout.addWidget(self.upgrade_button_test)
main_layout.addLayout(button_layout)
# 添加分割线
@ -161,10 +166,42 @@ class SocketClientApp(QMainWindow):
self.connect_button.clicked.connect(self.connect_to_server)
self.get_data_button.clicked.connect(self.on_button_clicked)
self.upgrade_button.clicked.connect(self.on_button_upgrade)
self.upgrade_button_test.clicked.connect(self.on_button_upgrade_test)
# 设置布局策略,确保控件大小随窗口调整
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
def get_extremes(self,data):
"""获取最大和最小的10个值排序法"""
sorted_data = np.sort(data)
return {
'top10_max': sorted_data[-10:][::-1].tolist(), # 降序排列
'top10_min': sorted_data[:10].tolist()
}
def mean_without_max_optimized(self,data):
"""优化内存使用的版本"""
arr = np.array(data)
if len(arr) < 2:
return np.nan
max_val = np.max(arr)
# 计算总和和计数时直接排除最大值
total = np.sum(arr) - max_val
count = len(arr) - 1
return total / count
def mean_without_min_optimized(self, data):
"""优化内存使用的版本"""
arr = np.array(data)
if len(arr) < 2:
return np.nan
min_val = np.min(arr)
# 计算总和和计数时直接排除最大值
total = np.sum(arr) - min_val
count = len(arr) - 1
return total / count
def calculate_crc(self,data: bytes) -> int:
"""计算数据的累加和CRC"""
crc = 0
@ -173,25 +210,26 @@ class SocketClientApp(QMainWindow):
return crc & 0xFF # 只保留最低字节
def connect_to_server(self):
""" 连接到服务器 """
ip = self.ip_input.text()
port = self.port_input.text()
self.ip = self.ip_input.text()
self.port = self.port_input.text()
if not ip or not port:
if not self.ip or not self.port:
self.status_bar.showMessage("状态: 请输入有效的 IP 和端口号")
return
try:
port = int(port)
self.port = int(self.port)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.settimeout(2)
# 设置 keep-alive 选项
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
self.socket.connect((ip, port))
self.socket.connect((self.ip, self.port))
self.get_data_button.setEnabled(True) # 连接成功,启用获取数据按钮
self.upgrade_button.setEnabled(True)
self.status_bar.showMessage(f"状态: 连接成功! 服务器 {ip}:{port}")
self.upgrade_button_test.setEnabled(True)
self.status_bar.showMessage(f"状态: 连接成功! 服务器 {self.ip}:{self.port}")
except Exception as e:
self.status_bar.showMessage(f"状态: 连接失败 - {str(e)}")
@ -274,7 +312,7 @@ class SocketClientApp(QMainWindow):
""" 获取数据并绘制 """
try:
self.status_bar.showMessage("状态: 正在获取数据...")
self.socket.sendall(bytes([0xAA, 0x55, 0xAA,0x01])) # 发送数据
self.socket.sendall(bytes([0xAA,0x55,0xAA,0x01,0x00,0x00,0x01,0x00,0x77,0x01,0x00,0x01,0x00,0x00,0x00])) # 发送数据
data = self.process_packet() # 接收所有数据
data = np.frombuffer(data, dtype=np.int32) # 根据实际数据格式转换
for i in range(min(100, len(data))): # 确保不超过数据长度
@ -285,6 +323,14 @@ class SocketClientApp(QMainWindow):
for i in range(min(100, len(scaled_data))): # 确保不超过数据长度
print(f"{scaled_data[i]:2f}", end=" ")
print() # 换行
result = self.get_extremes(scaled_data)
print("最大的10个值:", result['top10_max'])
print("最小的10个值:", result['top10_min'])
mean_max = self.mean_without_max_optimized(result['top10_max'])
print(f"top10_max 去除最大的数据后的平均值1{mean_max}")
mean_min = self.mean_without_min_optimized(result['top10_min'])
print(f"top10_min 去除最大的数据后的平均值2{mean_min}")
print(f"pp :{mean_max - mean_min}")
self.canvas.plot_data(scaled_data) # 在 Qt 界面中绘图
self.status_bar.showMessage("状态: 数据绘制完成")
except Exception as e:
@ -338,6 +384,56 @@ class SocketClientApp(QMainWindow):
except Exception as e:
print(f"Upgrade failed: {str(e)}")
def on_button_upgrade_test(self):
"""打开文件选择对话框"""
file_path, _ = QFileDialog.getOpenFileName(
self, "选择升级文件", "", "二进制文件 (*.bin);;所有文件 (*)"
)
if file_path:
file_name = os.path.basename(file_path)
self.status_bar.showMessage(f"已选择: {file_name}")
try:
print("Starting upgrade process...")
if not os.path.exists(file_path):
raise FileNotFoundError(f"Upgrade file {file_path} not found")
with open(file_path, "rb") as f:
package_data = f.read()
if not package_data:
raise ValueError("Upgrade file is empty")
print(f"Read upgrade package, size: {len(package_data)} bytes")
upgrade_len = len(package_data)
crc = self.calculate_crc(package_data)
upgrade_req = struct.pack("<IB", upgrade_len, crc) + package_data
header_magic = bytes([0xAA, 0x55, 0xAA])
cmd = 0x05
version = 1
result_code = 0
package_head = struct.pack("<3sBBB", header_magic, cmd, version, result_code)
full_packet = package_head + upgrade_req
print("Full packet prepared:")
print(f"Header magic: {package_head[:3].hex()}")
print(f"Command: {cmd}, Version: {version}")
print(f"Upgrade length: {upgrade_len}, CRC: {crc}")
print(f"Total packet size: {len(full_packet)} bytes")
self.socket.sendall(full_packet)
sleep(15)
self.socket.close()
self.connect_to_server()
self.socket.sendall(full_packet)
print("Upgrade packet ready to send (commented out actual send code)")
except Exception as e:
print(f"Upgrade failed: {str(e)}")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = SocketClientApp()