《C#上位机开发从门外到门内》3-3:基于USB的设备管理系统

发布于:2025-03-18 ⋅ 阅读:(19) ⋅ 点赞:(0)

在这里插入图片描述


在这里插入图片描述

1. 项目概述

在这里插入图片描述

1.1 项目背景

在工业自动化和实验室环境中,许多设备(如工业相机、测量仪器等)通过USB接口与计算机通信。本项目旨在开发一个基于USB的设备管理系统,能够控制外设、监测设备状态,并将相关数据存储到数据库中,以实现设备的集中管理和数据分析。
在这里插入图片描述

1.2 项目目标

  1. 通过USB接口控制外设(如工业相机、测量设备)。
  2. 实时监测设备状态(如连接状态、工作状态等)。
  3. 将设备数据存储到数据库中,支持历史数据查询和分析。
  4. 提供可视化界面,方便用户查看设备状态和数据。

1.3 技术栈

  • 通信协议:USB协议(基于PyUSB库)
  • 编程语言:Python(用于设备控制和数据存储)
  • 数据库:SQLite/MySQL(用于数据存储)
  • 可视化工具:PyQt/Tkinter(用于用户界面)
  • 硬件设备:工业相机、测量仪器等USB设备。

2. 系统架构设计

2.1 系统架构图

+-------------------+       +-------------------+       +-------------------+
|                   |       |                   |       |                   |
|  USB设备          |<----->|  设备控制模块     |<----->|  数据存储模块     |
|  (工业相机等)     |       |  (Python脚本)     |       |  (SQLite/MySQL)   |
|                   |       |                   |       |                   |
+-------------------+       +-------------------+       +-------------------+
                                |                           |
                                |                           |
                                v                           v
                        +-------------------+       +-------------------+
                        |                   |       |                   |
                        |  设备状态监测模块 |<----->|  用户界面         |
                        |  (Python脚本)     |       |  (PyQt/Tkinter)   |
                        |                   |       |                   |
                        +-------------------+       +-------------------+

2.2 模块功能

  1. 设备控制模块

    • 通过USB接口与设备通信,发送控制指令(如拍照、测量等)。
    • 接收设备返回的数据(如图像、测量结果等)。
  2. 设备状态监测模块

    • 实时监测设备的连接状态和工作状态。
    • 记录设备状态变化(如连接/断开、故障等)。
  3. 数据存储模块

    • 将设备数据(如图像、测量结果)和状态信息存储到数据库中。
    • 支持实时数据写入和历史数据查询。
  4. 用户界面

    • 提供图形化界面,方便用户查看设备状态和数据。
    • 支持设备控制和数据查询功能。

3. 设备控制模块实现

3.1 USB通信简介

USB(通用串行总线)是一种广泛使用的设备通信接口,支持热插拔和高速数据传输。通过PyUSB库,可以方便地与USB设备通信。

3.2 设备控制流程

  1. 初始化USB设备

    • 查找并连接目标USB设备。
    • 配置设备的通信参数(如端点、传输模式等)。
  2. 发送控制指令

    • 根据设备协议,发送控制指令(如拍照、测量等)。
    • 接收设备返回的数据(如图像、测量结果等)。
  3. 数据解析与处理

    • 解析设备返回的数据,转换为实际物理量(如图像、测量值等)。
    • 添加时间戳和数据标签。

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 设备状态监测流程

  1. 设备连接状态监测

    • 定期检查设备是否连接。
    • 记录设备连接/断开事件。
  2. 设备工作状态监测

    • 读取设备状态寄存器或状态码。
    • 记录设备工作状态(如空闲、运行、故障等)。

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 数据库设计

  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
    );
    
  2. 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 数据存储流程

  1. 连接数据库

    • 使用Python的SQLite或MySQL客户端库连接数据库。
  2. 写入数据

    • 将设备数据和状态信息插入到数据库中。

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 界面设计

  1. 设备状态显示
    • 显示设备的连接状态和工作状态。
  2. 设备控制按钮
    • 提供拍照、测量等控制按钮。
  3. 数据展示区域
    • 显示设备数据(如图像、测量结果)。

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 测试流程

  1. 设备控制测试
    • 验证设备控制指令是否正确执行。
  2. 状态监测测试
    • 验证设备状态是否正确监测。
  3. 数据存储测试
    • 验证数据是否成功写入数据库。
  4. 用户界面测试
    • 验证界面功能是否正常。

8. 总结

本项目通过USB接口实现了设备的控制、状态监测和数据存储,为工业设备和实验室仪器的集中管理提供了完整的解决方案。通过模块化设计和灵活的技术选型,系统具有良好的扩展性和可维护性,能够满足不同场景的需求。