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

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

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

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

一、串口通信

1.安装System.IO.Ports

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

 

5.效果

直接运行2个客户端

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

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

二、USB通信

1.安装Management

2.操作USB有2种方式

一是LibUsbDotNet

二是使用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/InvokeIntPtr 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.效果

 

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

源码

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/26416.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序下拉选择

微信小程序中下拉框选择一般的交互方式有以下两种 直接下拉选择点击选择框后&#xff0c;弹出浮层进行选择 下边分别介绍两种方式的实现。在微信小程序中&#xff0c;这两种实现都需要修改三个文件 js 文件&#xff1a;下拉选择逻辑的具体实现 wxml 文件&#xff1a;下拉组件…

如何用Jmeter提取和引用Token

1.执行获取token接口 在结果树这里&#xff0c;使用$符号提取token值。 $根节点&#xff0c;$.data.token表示提取根节点下的data节点下的token节点的值。 2.使用json提取器&#xff0c;提取token 变量路径就是把在结果树提取的路径写上。 3.使用BeanShell取样器或者BeanShe…

用Python采集电商平台商品数据进行可视化分析

目录标题 前言环境使用:模块使用:基本流程思路:代码展示获取数据扩展知识数据可视化 尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 环境使用: python 3.8 解释器 pycharm 编辑器 模块使用: 第三方模块 需要安装 requests —> 发送 HTTP请求 内置模块 不需…

第一阶段-第十二章 Python基础的综合案例(数据可视化-动态柱状图)

目录 引、案例效果一、基础柱状图的构建  1.学习目标  2.通过Bar构建基础柱状图  3.反转x和y轴  4.数值标签在右侧  5.本节的演示  6.本小节的总结 二、基础时间线柱状图  1.学习目标  2.时间线  3. 自动播放  4.时间线的主题  5.本节的代码演示  6.本…

Java经典面试解析:服务器卡顿、CPU飙升、接口负载剧增

01 线上服务器CPU飙升&#xff0c;如何定位到Java代码 解决这个问题的关键是要找到Java代码的位置。下面分享一下排查思路&#xff0c;以CentOS为例&#xff0c;总结为4步。 第1步&#xff0c;使用top命令找到占用CPU高的进程。 第2步&#xff0c;使用ps –mp命令找到进程下…

React中使用Redux

1.为什么要使用redux redux是一个专门用于状态管理的一个库&#xff0c;和vue中的vuex功能类似。其中核心点就是状态的管理。虽然我们无论在vue还是在react中我们组件间的通行都可以使用消息总线或者父子组件间的消息传递来进行操作。但是如果我们需要A组件的状态在其他十个或者…

面试题汇总——Java集合(Collection和Map)

1简单介绍一下Java集合类 位置:Java的所有集合类都在java.util包下,从JDK5.0开始为了处理多线程环境下的并发安全问题,又在java.util.concurrent包下提供了一些多线程支持的集合类。 内容:Java的集合类主要有两个接口派生而出:Collection和Map。 1.1Collection Collect…

重封装Ehcache与Redis模板以便于一二级缓存同步数据(二)

参考: 一级缓存二级缓存的获取与更新顺序&#xff08;一) 简单封装Ehcache与RedisTemplate模版 通常使用一二级缓存时,必须保持一二级缓存数据数据与数据库中数据保持一致 &#xff1b;此时可以简单封装下,一二级缓存的相关接口,便于我…

多元函数的混合偏导数

直接看图&#xff1a; 引自知乎&#xff1a;点击跳转知乎链接

记录自己的程序移植经历(裸机软PLC C语言程序移植到Linux)

先说一下本人的基础&#xff0c;本人是一个小公司初来乍到的实习生&#xff0c;拿到这个任务的时候&#xff0c;不懂PLC&#xff0c;而对于linux只懂一点点皮毛的操作。结果硬是把程序移植完毕且能顺利运行。 该程序是嵌入式软PLC&#xff0c;主要代码是对四元式指令的解析。说…

可移植性测试包括哪些

可移植性测试 可移植性是指应用程序能够安装到不同的环境中&#xff0c;在不同的环境中使用&#xff0c;甚至可以移动到不同的环境中。当然&#xff0c;前两者对所有系统都很重要。就PC软件而言&#xff0c;鉴于操作系统、共存和互操作应用程序、硬件、带宽可用性等方面的快速…

Kubespray v2.22.1 在线部署 kubernetes v1.26.5 集群

文章目录 1. 介绍2. 预备条件3. 配置 hostname4. yum5. 下载介质5.1 git 下载5.2 下载 kubespray v2.22.1 6. 编写 inventory.ini7. 配置互信8. 安装 ansible9. 关闭防火墙10. 安装 docker11. 配置内核参数12. 启动容器 kubespray13. 部署14. 配置连接集群 1. 介绍 kubespray​…