1. 项目背景和前提
在许多嵌入式系统或开发板中,串口通信是一种常见的通信方式。通过串口,计算机与外部硬件设备(如开发板、传感器等)进行数据交换。为了简化这些硬件之间的数据交互,我们设计了一个串口开发工具,使得用户能够通过串口方便地传输文件,并确保数据传输的完整性。
前提要求:
- PyQt5:该工具是基于 PyQt5 库开发的,用户需要安装 PyQt5 来运行此工具。
- QtSerialPort:用于管理串口通信,确保数据能够通过串口发送和接收。
- 串口设备:用户需要确保电脑或开发板上有串口设备,并正确连接。
- 文件格式:支持发送文本文件和二进制文件。文件通过串口发送时,支持计算 MD5 校验和,以确保数据传输的完整性。
2. 工具功能概述
该串口开发工具主要包括以下功能:
- 选择串口:用户可以选择可用的串口设备。
- 选择文件:用户选择要通过串口发送的文件,工具会自动计算文件的 MD5 校验和。
- 发送文件:工具会将文件的内容通过串口发送给接收端,支持文本文件(ASCII 格式)和二进制文件。
- 接收文件:工具可以接收通过串口传输的数据,并尝试以 ASCII 格式或二进制格式显示。
- MD5 校验:在发送文件前,工具会计算文件的 MD5 校验和,并将其发送,接收端可以验证文件的完整性。
3. 工具界面
界面组成:
- 串口选择:用户可以从下拉框中选择已连接的串口。
- 文件选择:用户选择要发送的文件,并查看文件的 MD5 校验和和文件内容预览。
- 波特率选择:用户可以选择串口通信的波特率。
- 发送按钮:点击发送按钮将选定的文件通过串口发送。
- 接收按钮:点击接收按钮接收从串口传来的数据。
- 控制按钮:提供打开和关闭串口的按钮。
- 清空按钮:清空界面上的显示内容。
1. 选择串口
点击“选择串口”按钮后,会通过 QSerialPortInfo.availablePorts()
获取当前计算机可用的串口,并填充到串口选择框中。
代码:
def populate_ports(self):
"""填充串口列表"""
self.port_combo.clear() # 清空之前的串口列表
ports = QSerialPortInfo.availablePorts()
if not ports:
self.text_area.append("没有检测到串口设备")
for port in ports:
self.port_combo.addItem(port.portName())
self.text_area.append(f"检测到串口: {port.portName()}")
2. 选择文件
点击“选择文件”按钮后,会弹出文件选择框,允许用户选择一个文件。工具会计算该文件的 MD5 校验和并显示文件的前500个字节。
代码:
def select_file(self):
"""选择文件并计算MD5校验和"""
try:
file_name, _ = QFileDialog.getOpenFileName(self, "选择文件", "", "所有文件 (*)")
if file_name:
self.selected_file = file_name # 保存用户选择的文件路径
# 计算文件的MD5校验和
file_md5 = self.calculate_md5(file_name)
self.text_area.append(f"文件MD5校验和: {file_md5}")
# 读取文件内容
with open(file_name, 'rb') as f:
file_content = f.read()
self.text_area.append(f"文件内容(前500字节):\n{file_content[:500]}...") # 显示文件的前500字节
except Exception as e:
self.text_area.append(f"文件读取失败: {str(e)}")
3. 计算文件 MD5 校验和
计算文件的 MD5 校验和,以确保文件传输的完整性。通过 hashlib.md5()
实现。
代码:
def calculate_md5(self, file_path):
"""计算文件的MD5校验和"""
md5 = hashlib.md5()
try:
with open(file_path, 'rb') as f:
while chunk := f.read(8192):
md5.update(chunk)
return md5.hexdigest()
except Exception as e:
self.text_area.append(f"MD5计算失败: {str(e)}")
return None