《C#上位机开发从门外到门内》3-3:基于USB的设备管理系统
文章目录
- **1. 项目概述**
- **1.1 项目背景**
- **1.2 项目目标**
- **1.3 技术栈**
- **2. 系统架构设计**
- **2.1 系统架构图**
- **2.2 模块功能**
- **3. 设备控制模块实现**
- **3.1 USB通信简介**
- **3.2 设备控制流程**
- **3.3 代码实现**
- **4. 设备状态监测模块实现**
- **4.1 设备状态监测流程**
- **4.2 代码实现**
- **5. 数据存储模块实现**
- **5.1 数据库设计**
- **5.2 数据存储流程**
- **5.3 代码实现**
- **SQLite版本**
- **MySQL版本**
- **6. 用户界面实现**
- **6.1 界面设计**
- **6.2 代码实现**
- **PyQt版本**
- **Tkinter版本**
- **7. 系统部署与测试**
- **7.1 部署环境**
- **7.2 测试流程**
- **8. 总结**

1. 项目概述
1.1 项目背景
在工业自动化和实验室环境中,许多设备(如工业相机、测量仪器等)通过USB接口与计算机通信。本项目旨在开发一个基于USB的设备管理系统,能够控制外设、监测设备状态,并将相关数据存储到数据库中,以实现设备的集中管理和数据分析。
1.2 项目目标
- 通过USB接口控制外设(如工业相机、测量设备)。
- 实时监测设备状态(如连接状态、工作状态等)。
- 将设备数据存储到数据库中,支持历史数据查询和分析。
- 提供可视化界面,方便用户查看设备状态和数据。
1.3 技术栈
- 通信协议:USB协议(基于PyUSB库)
- 编程语言:Python(用于设备控制和数据存储)
- 数据库:SQLite/MySQL(用于数据存储)
- 可视化工具:PyQt/Tkinter(用于用户界面)
- 硬件设备:工业相机、测量仪器等USB设备。
2. 系统架构设计
2.1 系统架构图
+-------------------+ +-------------------+ +-------------------+
| | | | | |
| USB设备 |<----->| 设备控制模块 |<----->| 数据存储模块 |
| (工业相机等) | | (Python脚本) | | (SQLite/MySQL) |
| | | | | |
+-------------------+ +-------------------+ +-------------------+
| |
| |
v v
+-------------------+ +-------------------+
| | | |
| 设备状态监测模块 |<----->| 用户界面 |
| (Python脚本) | | (PyQt/Tkinter) |
| | | |
+-------------------+ +-------------------+
2.2 模块功能
-
设备控制模块:
- 通过USB接口与设备通信,发送控制指令(如拍照、测量等)。
- 接收设备返回的数据(如图像、测量结果等)。
-
设备状态监测模块:
- 实时监测设备的连接状态和工作状态。
- 记录设备状态变化(如连接/断开、故障等)。
-
数据存储模块:
- 将设备数据(如图像、测量结果)和状态信息存储到数据库中。
- 支持实时数据写入和历史数据查询。
-
用户界面:
- 提供图形化界面,方便用户查看设备状态和数据。
- 支持设备控制和数据查询功能。
3. 设备控制模块实现
3.1 USB通信简介
USB(通用串行总线)是一种广泛使用的设备通信接口,支持热插拔和高速数据传输。通过PyUSB库,可以方便地与USB设备通信。
3.2 设备控制流程
-
初始化USB设备:
- 查找并连接目标USB设备。
- 配置设备的通信参数(如端点、传输模式等)。
-
发送控制指令:
- 根据设备协议,发送控制指令(如拍照、测量等)。
- 接收设备返回的数据(如图像、测量结果等)。
-
数据解析与处理:
- 解析设备返回的数据,转换为实际物理量(如图像、测量值等)。
- 添加时间戳和数据标签。
3.3 代码实现
import usb.core
import usb.util
# 查找设备
dev = usb.core.find(idVendor=0x1234, idProduct=0x5678)
if dev is None:
raise ValueError("Device not found")
# 配置设备
dev.set_configuration()
# 发送控制指令
endpoint_out = dev[0][(0, 0)][0]
endpoint_in = dev[0][(0, 0)][1]
# 发送拍照指令
dev.write(endpoint_out, b'\x01\x00\x00\x00')
# 读取图像数据
data = dev.read(endpoint_in, 1024)
print("Image data received:", data)
4. 设备状态监测模块实现
4.1 设备状态监测流程
-
设备连接状态监测:
- 定期检查设备是否连接。
- 记录设备连接/断开事件。
-
设备工作状态监测:
- 读取设备状态寄存器或状态码。
- 记录设备工作状态(如空闲、运行、故障等)。
4.2 代码实现
import time
def check_device_status(dev):
try:
# 读取设备状态
status = dev.read(endpoint_in, 1)
return status[0]
except usb.core.USBError:
return None # 设备断开
# 定期检查设备状态
while True:
status = check_device_status(dev)
if status is None:
print("Device disconnected")
elif status == 0:
print("Device idle")
elif status == 1:
print("Device running")
elif status == 2:
print("Device error")
time.sleep(1)
5. 数据存储模块实现
5.1 数据库设计
-
SQLite表结构:
CREATE TABLE device_data ( id INTEGER PRIMARY KEY AUTOINCREMENT, device_id TEXT NOT NULL, data_type TEXT NOT NULL, data_value TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE device_status ( id INTEGER PRIMARY KEY AUTOINCREMENT, device_id TEXT NOT NULL, status TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP );
-
MySQL表结构:
CREATE TABLE device_data ( id INT AUTO_INCREMENT PRIMARY KEY, device_id VARCHAR(50) NOT NULL, data_type VARCHAR(50) NOT NULL, data_value TEXT NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE device_status ( id INT AUTO_INCREMENT PRIMARY KEY, device_id VARCHAR(50) NOT NULL, status VARCHAR(50) NOT NULL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP );
5.2 数据存储流程
-
连接数据库:
- 使用Python的SQLite或MySQL客户端库连接数据库。
-
写入数据:
- 将设备数据和状态信息插入到数据库中。
5.3 代码实现
SQLite版本
import sqlite3
# 连接SQLite数据库
conn = sqlite3.connect('device_db.sqlite')
cursor = conn.cursor()
# 插入设备数据
cursor.execute("INSERT INTO device_data (device_id, data_type, data_value) VALUES (?, ?, ?)",
("camera_1", "image", "image_data"))
conn.commit()
# 插入设备状态
cursor.execute("INSERT INTO device_status (device_id, status) VALUES (?, ?)",
("camera_1", "running"))
conn.commit()
# 关闭连接
conn.close()
MySQL版本
import mysql.connector
# 连接MySQL数据库
db = mysql.connector.connect(
host="localhost",
user="root",
password="password",
database="device_db"
)
# 插入设备数据
cursor = db.cursor()
sql = "INSERT INTO device_data (device_id, data_type, data_value) VALUES (%s, %s, %s)"
values = ("camera_1", "image", "image_data")
cursor.execute(sql, values)
db.commit()
# 插入设备状态
sql = "INSERT INTO device_status (device_id, status) VALUES (%s, %s)"
values = ("camera_1", "running")
cursor.execute(sql, values)
db.commit()
# 关闭连接
db.close()
6. 用户界面实现
6.1 界面设计
- 设备状态显示:
- 显示设备的连接状态和工作状态。
- 设备控制按钮:
- 提供拍照、测量等控制按钮。
- 数据展示区域:
- 显示设备数据(如图像、测量结果)。
6.2 代码实现
PyQt版本
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton
class DeviceManager(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 设备状态显示
self.status_label = QLabel("Device Status: Unknown", self)
self.status_label.move(20, 20)
# 拍照按钮
self.capture_button = QPushButton("Capture Image", self)
self.capture_button.move(20, 60)
self.capture_button.clicked.connect(self.capture_image)
# 窗口设置
self.setGeometry(100, 100, 300, 150)
self.setWindowTitle("Device Manager")
self.show()
def capture_image(self):
# 拍照逻辑
print("Capturing image...")
self.status_label.setText("Device Status: Capturing")
if __name__ == "__main__":
app = QApplication([])
window = DeviceManager()
app.exec_()
Tkinter版本
import tkinter as tk
class DeviceManager:
def __init__(self, root):
self.root = root
self.initUI()
def initUI(self):
# 设备状态显示
self.status_label = tk.Label(self.root, text="Device Status: Unknown")
self.status_label.pack()
# 拍照按钮
self.capture_button = tk.Button(self.root, text="Capture Image", command=self.capture_image)
self.capture_button.pack()
def capture_image(self):
# 拍照逻辑
print("Capturing image...")
self.status_label.config(text="Device Status: Capturing")
if __name__ == "__main__":
root = tk.Tk()
app = DeviceManager(root)
root.mainloop()
7. 系统部署与测试
7.1 部署环境
- 硬件:工业相机、测量仪器等USB设备。
- 软件:Python 3.8、SQLite/MySQL、PyQt/Tkinter。
7.2 测试流程
- 设备控制测试:
- 验证设备控制指令是否正确执行。
- 状态监测测试:
- 验证设备状态是否正确监测。
- 数据存储测试:
- 验证数据是否成功写入数据库。
- 用户界面测试:
- 验证界面功能是否正常。
8. 总结
本项目通过USB接口实现了设备的控制、状态监测和数据存储,为工业设备和实验室仪器的集中管理提供了完整的解决方案。通过模块化设计和灵活的技术选型,系统具有良好的扩展性和可维护性,能够满足不同场景的需求。