.net6中WPF的串口通信和USB通信

这篇具有很好参考价值的文章主要介绍了.net6中WPF的串口通信和USB通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

之前写过串口通信,不过是winform的。

c#使用串口进行通信_c# 串口通信_故里2130的博客-CSDN博客

今天说一下,.net6中wpf的串口通信和USB通信,在工控行业中,这2种的方式非常多,还有网口通信,它们都是用来和硬件打交道的,进行交互信息。

一、串口通信

1.安装System.IO.Ports

.net6中WPF的串口通信和USB通信,C#,c#,.net,wpf

2.基本上代码都是一样的,xaml界面

<Window x:Class="WPFPortsUSB.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPFPortsUSB"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <TextBox Name="txtPort"/>
        <Button Name="btnLink" Height="25" Content="连接" Click="btnLink_Click"/>
        <TextBox Name="txtSend"/>
        <Button Name="btnSend" Height="25" Content="发送" Click="btnSend_Click"/>
        <TextBlock Text="接收的数据"/>
        <TextBox Name="txtReceive"/>
    </StackPanel>
</Window>

3.cs代码

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WPFPortsUSB
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        SerialPort serialPort = new SerialPort();
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnLink_Click(object sender, RoutedEventArgs e)
        {
            string[] ports = System.IO.Ports.SerialPort.GetPortNames();
            if (ports.Length == 0)
            {
                MessageBox.Show("本机没有串口!");
            }
            serialPort.PortName = ports[Convert.ToInt16(txtPort.Text)];//这里的0,就是COM1,1是COM2。因为电脑创建了2个COM串口
            serialPort.BaudRate = 9600;//波特率
            serialPort.DataBits = 8;//数据位
            serialPort.StopBits = System.IO.Ports.StopBits.One;//停止位
            //serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");//此行非常重要,解决接收中文乱码的问题
            serialPort.DataReceived += SerialPort_DataReceived;

            // 打开串口
            try
            {
                serialPort.Open();
            }
            catch (Exception ex)
            {
                //捕获到异常信息,创建一个新的comm对象,之前的不能用了。  
                serialPort = new System.IO.Ports.SerialPort();
                //将异常信息传递给用户。  
                MessageBox.Show(ex.Message);
                return;
            }
        }

        private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(500);
            string txt = serialPort.ReadExisting();
            this.Dispatcher.Invoke(new Action(() =>
            {
                txtReceive.Text = txt;
            }));

        }

        private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            serialPort.Write(txtSend.Text);
        }
    }
}

4.开启2个COM

 .net6中WPF的串口通信和USB通信,C#,c#,.net,wpf

5.效果

直接运行2个客户端

一个写1端口,一个写2端口,进行通信

可见,2个客户端能进行信息传送

.net6中WPF的串口通信和USB通信,C#,c#,.net,wpf

二、USB通信

1.安装Management

.net6中WPF的串口通信和USB通信,C#,c#,.net,wpf

2.操作USB有2种方式

一是LibUsbDotNet

.net6中WPF的串口通信和USB通信,C#,c#,.net,wpf

二是使用P/Invoke

3.代码

using LibUsbDotNet.Main;
using LibUsbDotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using LibUsbDotNet.Info;

namespace USB
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        //const int HID_DEVICE_VID = 0x093A;
        //const int HID_DEVICE_PID = 0x2533;
        const int HID_DEVICE_VID = 0x0461;
        const int HID_DEVICE_PID = 0x4E28;
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnQuery_Click(object sender, RoutedEventArgs e)
        {
            ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\CIMV2");
            ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_USBHub");

            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
            {
                ManagementObjectCollection collection = searcher.Get();

                string str = string.Empty;
                foreach (ManagementObject device in collection)
                {
                    str += device["Name"].ToString() + device["DeviceID"] + "\r";
                    //Console.WriteLine("设备名称: " + device["Name"]);
                    //Console.WriteLine("设备ID: " + device["DeviceID"]);
                    //Console.WriteLine();
                }
                txtReceive.Text = str;
            }

        }

        public static void GetUSBInfo()
        {
            UsbRegDeviceList allDevices = UsbDevice.AllDevices;
            Console.WriteLine("Found {0} devices", allDevices.Count);
            foreach (UsbRegistry usb in allDevices)
            {
                Console.WriteLine("----------------");
                Console.WriteLine($"Device info: {usb.Device.Info.ProductString}");
                Console.WriteLine($"Pid: {usb.Pid}, VID: {usb.Vid}");
            }
            Console.WriteLine(allDevices.Count);
        }

        private void btnOK_Click(object sender, RoutedEventArgs e)
        {
            //1.使用LibUsbDotNet
            // 获取所有已连接的USB设备
            GetUSBInfo();
            //var usbDevices = UsbDevice.AllDevices;

             遍历每个USB设备
            //foreach (UsbDevice usbDevice in usbDevices)
            //{
            //    // 打印USB设备的信息
            //    Console.WriteLine("设备描述: " + usbDevice.Info.DeviceDescription);
            //    Console.WriteLine("厂商ID: " + usbDevice.Info.UsbVendorId);
            //    Console.WriteLine("产品ID: " + usbDevice.Info.UsbProductId);
            //    Console.WriteLine();

            //    // 检查是否为目标设备(根据VID和PID判断)
            //    if (usbDevice.Info.UsbVendorId == 0x1234 && usbDevice.Info.UsbProductId == 0x5678)
            //    {
            //        try
            //        {
            //            // 打开USB设备
            //            usbDevice.Open();

            //            // 进行你的USB通信操作(读取或写入数据等)
            //            // ...

            //            // 关闭USB设备
            //            usbDevice.Close();
            //        }
            //        catch (Exception ex)
            //        {
            //            Console.WriteLine("发生异常: " + ex.Message);
            //        }
            //    }
            //}



            //2.使用P/Invoke
            IntPtr deviceHandle = UsbCommunication.OpenHidDevice(HID_DEVICE_VID, HID_DEVICE_PID);

            if (deviceHandle != IntPtr.Zero)
            {
                byte[] sendData = { /* 发送的数据 */ };
                byte[] receiveData = new byte[64];

                int bytesWritten = UsbCommunication.WriteHid(deviceHandle, sendData, sendData.Length);
                int bytesRead = UsbCommunication.ReadHid(deviceHandle, receiveData, receiveData.Length);

                // 处理接收到的数据

                UsbCommunication.CloseHidDevice(deviceHandle);
            }
            else
            {
                Console.WriteLine("无法打开HID设备");
            }

            Console.WriteLine("按任意键退出...");
            Console.ReadKey();
        }

        class UsbCommunication
        {
            // 调用底层库进行USB通信,此处省略具体实现,需要根据实际情况编写相应的P/Invoke声明和方法实现
            [DllImport("usb_communication.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern IntPtr OpenHidDevice(int vid, int pid);

            [DllImport("usb_communication.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern int WriteHid(IntPtr handle, byte[] data, int length);

            [DllImport("usb_communication.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern int ReadHid(IntPtr handle, byte[] data, int length);

            [DllImport("usb_communication.dll", CallingConvention = CallingConvention.Cdecl)]
            public static extern void CloseHidDevice(IntPtr handle);
        }
    }
}

4.效果

.net6中WPF的串口通信和USB通信,C#,c#,.net,wpf

目前只是查询出来4个USB设备,但是对USB进行发送和接收信息,还有报错。这个似乎需要和硬件通信协议和数据传输规范有关系,否则好像成功不了,也不清楚可不可以使用虚拟的USB,类似于COM虚拟口一样操作,暂时这么记录吧。 

源码

https://download.csdn.net/download/u012563853/88053882

来源:.net6中WPF的串口通信和USB通信_.net usb通信_故里2130的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-572575.html

到了这里,关于.net6中WPF的串口通信和USB通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Azure DevOps(一)基于 Net6.0 的 WPF 程序如何进行持续集成、持续编译

    我们是否正在为如何快速的编译、部署客户端应用程序而烦恼?这也是博主最近遇到的问题。目前博主所在公司主要做项目级的定制化开发,多以 C/S 架构的 WPF 程序为主,每次到了协助开发团队给实施团队编译好的要测试程序包时,就会出现多人协助,编译、打包好的二进制

    2023年04月19日
    浏览(45)
  • WPF .Net6框架下, 使用 Microsoft.Xaml.Behaviors.Wpf 的Interaction.Triggers特性,实现ComboBox 在展开时,触发刷新列表内容的动作

    ComboBox 在WPF中是常见的控件。 一般情况下,在绑定好数据源后,其内容是固定的。 当然,你也可以实时刷新,但这将带来较高的资源消耗。 因此有个折中的办法: 只在它在展开时,自动更新列表内容。 当前文章基于 .Net6框架,其他框架不适用。 这个是用于平替winform某个组

    2024年02月09日
    浏览(58)
  • WPF:.Net6框架下,使用Material Design过程中,配色和UI字体模糊的问题

    有关Material Design的使用方法,请自行参考这个链接 WPF使用Material Design 下面,直接上我碰到的问题及解决方式 默认情况下,Material Design是提供了很多主题配色,但难免有些太过“出挑”,不适合工控软件的风格。 所以,下面简单介绍一下手动配色的基础方法: 代表采用的是

    2024年02月06日
    浏览(56)
  • wpf C# 用USB虚拟串口最高速下载大文件 每包400万字节 平均0.7s/M,支持批量多设备同时下载。自动识别串口。源码示例可自由定制。

    C# 用USB虚拟串口下载大文件 每包400万字节 平均0.7s/M。支持批量多设备同时下载。自动识别串口。可自由定制。 int 32位有符号整数 -2147483648~2147483647 但500万字节时 write时报端口IO异常。可能是驱动限制的。 之前用这个助手发文件,连续发送,会被分包1024byte/包。速度会慢下来

    2024年02月09日
    浏览(45)
  • C# WPF监听USB插入拨出

    可以全部监听。好用   以下可以部分监听 以下不行 

    2024年02月11日
    浏览(37)
  • 【WPF.NET开发】WPF中的窗口

    目录 1、窗口类 2、实现窗口 2.1 为 MSBuild 配置窗口 3、窗口生存期 3.1 打开窗口 3.2 窗口激活 3.3 关闭窗口 3.4 窗口生存期事件 4、窗口位置 4.1 最顶层窗口和 z 顺序 5、窗口大小 6、大小调整属性的优先级顺序 7、窗口状态 8、窗口外观 8.1 重设大小模式 8.2 Window style 8.3 任务栏显示

    2024年02月04日
    浏览(43)
  • 【WPF.NET开发】WPF中的版式

    改进的文本质量和性能 丰富的版式 增强的国际文本支持 增强的字体支持 新的文本应用程序编程接口 (API) 本主题介绍 WPF 的主要版式功能。 这些功能包括改进的文本呈现质量和性能、OpenType 版式支持、增强的国际文本、增强的字体支持和新的文本应用程序编程接口 (API)。

    2024年02月01日
    浏览(42)
  • 【WPF.NET开发】WPF中的文档

    文档类型 文档控件和文本布局 文档打包 XPS 文档 Windows Presentation Foundation (WPF) 提供丰富的文档功能,可创建旨在比前几代 Windows 更易于访问和读取的高保真内容文档。 除增强功能和质量外,WPF 还对文档显示、打包和安全性能提供集成服务。 本主题介绍 WPF 文档类型和文档打

    2024年01月17日
    浏览(46)
  • 【WPF.NET开发】WPF中的拖放

    WPF 中的拖放支持 数据传输 拖放事件 实现拖放 拖放示例 本主题概述 Windows Presentation Foundation (WPF) 应用程序中的拖放支持。 拖放通常指一种数据传输方法:使用鼠标(或一些其他指针设备)选择一个或多个对象,将其拖至用户界面 (UI) 中的某些所需拖放目标之上并放置。 拖

    2024年01月21日
    浏览(35)
  • 【WPF.NET开发】WPF中的XAML资源

    使用 XAML 中的资源 静态和动态资源 静态资源 动态资源 样式、DataTemplate 和隐式键 资源是可以在应用中的不同位置重复使用的对象。 资源的示例包括画笔和样式。 本概述介绍如何使用 Extensible Application Markup Language (XAML) 中的资源。 你还可以使用代码创建和访问资源。  备注

    2024年01月17日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包