C#上位机的USB通信与串口通信接口区别

USB通信与串口通信接口的代码区别有以下几个方面:

  1. 通信方式不同:串口通信采用全双工或半双工通信方式,而USB通信采用异步、同步和批量传输等多种传输方式。
  2. 端口号设置不同:串口通信设置端口号,如"COM1"、"COM2"等,而USB通信通过设备描述符和VID/PID等参数进行识别和匹配。
  3. 数据读取方式不同:串口通信中常使用_serialPort.ReadLine()方法从接收缓冲区中读取数据,而USB通信则可以通过自定义数据读取方式进行读取。

下面是USB通信的示例代码,与之前给出的串口通信代码相比进行了一些修改:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Management;

namespace USBCommunication
{
    public partial class Form1 : Form
    {
        private const string VID = "XXXX";    // USB设备的VID
        private const string PID = "XXXX";    // USB设备的PID
        private const string DEVICE_NAME = "MyUSBDevice";    // USB设备的名称
        private const int PACKET_SIZE = 64;   // USB传输数据包大小
        private bool _deviceConnected = false;   // 标记USB设备的连接状态
        private byte[] _dataReceiveBuffer = new byte[PACKET_SIZE];  // 接收缓冲区

        public Form1()
        {
            InitializeComponent();

            // 订阅DeviceArrived和DeviceRemoved事件,当USB设备连接或移除时触发
            SystemEvents.Deviceived += new Microsoft.Win32.DeviceEventHandler(SystemEvents_DeviceArrived);
            SystemEvents.DeviceRemoved += new Microsoft.Win32.DeviceEventHandler(SystemEvents_DeviceRemoved);
        }

        private void btnOpen_Click(object sender, EventArgs e)
        {
            if (!_deviceConnected)
            {
                MessageBox.Show("请先连接USB设备!");
                return;
            }
            // TODO: 打开USB设备,开始数据通信
        }

        private void btnClose_Click(object sender, EventArgs e)
        {
            // TODO: 关闭USB设备,停止数据通信
        }

        private void SystemEvents_DeviceArrived(object sender, Microsoft.Win32.DeviceEventArgs e)
        {
            // 判断连接设备是不是我们需要的USB设备
            if (CheckUSBDevice(VID, PID, DEVICE_NAME))
            {
                _deviceConnected = true;
                // TODO: 连接USB设备
            }
        }

        private void SystemEvents_DeviceRemoved(object sender, Microsoft.Win32.DeviceEventArgs e)
        {
            // 判断断开连接设备是不是我们需要的USB设备
            if (CheckUSBDevice(VID, PID, DEVICE_NAME))
            {
                _deviceConnected = false;
                // TODO: 断开USB设备
            }
        }

        private bool CheckUSBDevice(string vid, string pid, string deviceName)
        {
            boolUSBDevice = false;
            ManagementObjectCollection collection;
            using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))
                collection = searcher.Get();
            foreach (var device in collection)
            {
                if ((string)device.GetPropertyValue("DeviceID") == $"USB\\VID_{vid}&PID_{pid}\\{deviceName}")
                {
                    isUSBDevice = true;
                    break;
                }
            }
            collection.Dispose();
            return isUSBDevice;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs)
        {
            // TODO: 窗体关闭时释放USB设备资源
            if (_deviceConnected)
            {
                // TODO: 断开USB设备
            }
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            if (!_deviceConnected)
            {
                MessageBox.Show("请先连接USB设备!");
                return;
            }
            // TODO: 向USB设备写入数据
        }

        private void btnReceive_Click(object sender, EventArgs e)
        {
            if (!_deviceConnected)
            {
                MessageBox.Show("请先连接USB设备!");
                return;
            }
            // TODO: 从USB设备读取数据
        }
    }
}

在此示例代码中,通过SystemEvents.DeviceArrivedSystemEvents.DeviceRemoved事件监视USB设备的连接状态。在CheckUSBDevice方法中,通过设备的VID/PID和名称来进行设备的匹配。在实际开发中,也可以使用更加可靠的USB通信库,如libusb或USB4NET等,以便更好地控制USB设备和进行USB通信。

btnOpen_ClickbtnClose_Click事件中,需要根据实际需求进行USB设备的打开或关闭,以便进行数据通信。

btnSend_ClickbtnReceive_Click事件中,需要根据实际需求进行数据的读取和发送。由于USB传输数据时需要进行分包,因此在USB通信中常采用数据报文的方式进行数据的传输。例如,可以在数据包的首部添加数据长度信息,以便在接收端进行正确的数据组装和解析。

总的来说,USB通信与串口通信的代码区别不仅体现在通信方式、端口号设置和数据读取方式等方面,还需要考虑USB设备的连接状态监测、设备的匹配和连接、数据包的大小和报文格式等问题。因此,在进行USB通信时,需要更加严谨和专业的设计和开发。

你可能感兴趣的:(ASP.NET,MVC,上位机,C#,串口通信,USB,通信)