STM32 USB 开发(二)HID Slave 通信 --- 简单上位机开发
文章目录
- 前言
- 一、准备数据
- 二、在VS中开发上位机
- 1.引入国外大神写的USB通讯库HidLibary
- 2.新建HID管理类 CustomHIDManager.cs
- 3.运行结果
- 总结
前言
在网上找了一圈发现,用C#来开发上位机还是比较简单的,因此在这里和大家分享一下开发的过程。
一、准备数据
将STM32的主函数main.c中修改一下发送的数据。
while (1){HAL_Delay(1000);debug("usb send data\r\n");USB_Recive_Buffer[10]=sendCount++;USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, USB_Recive_Buffer, 64);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);HAL_Delay(500);HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);HAL_Delay(500);//USB_Recive_Buffer[63]='\0';HAL_UART_Transmit_DMA(&huart1, (uint8_t *)USB_Recive_Buffer, 64);HAL_Delay(1000);debug("USB_Received_Count=== %d\r\n",USB_Received_Count);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}
二、在VS中开发上位机
1.引入国外大神写的USB通讯库HidLibary
2.新建HID管理类 CustomHIDManager.cs
关键代码如下(示例):
class MyHIDManager : IDisposable{//自定义usb设备的PID和VID private const int ProductId = 0x5753;private const int VendorId = 0x0482;//usb设备private HidDevice device;//标志位private bool attached = false; private bool connectedToDriver=false;private bool disposed = false;//当设备插入时,触发的事件(可以暂时理解为函数指针,其实c#中委托是函数指针,事件可以理解为函数指针数组)public event EventHandler DeviceInserted;//当设备移除时,触发的事件(可以暂时理解为函数指针)public event EventHandler DeviceRemoved;//自定义数据接收的事件触发(可以暂时理解为函数指针)public event EventHandler<CustomHIDEventArgs> DataReceived;public MyHIDManager(){}/// <summary>/// 打开设备/// </summary>public bool OpenDevice(){device = HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault();if (device !=null){connectedToDriver = true;device.OpenDevice();device.Inserted += DeviceInsertedHandler;device.Removed += DeviceRemovedHandler;device.MonitorDeviceEvents = true;device.ReadReport(OnReport);return true;} return false;}/// <summary>/// 关闭设备/// </summary>public void CloseDevice(){device.CloseDevice();connectedToDriver = false;}//可以理解为插入后执行的回调函数private void DeviceInsertedHandler(){attached = true;if (DeviceInserted!=null){DeviceInserted(this, EventArgs.Empty);}device.ReadReport(OnReport);}//可以理解为拔掉后执行的回调函数private void DeviceRemovedHandler(){attached = false;if (DeviceRemoved != null){DeviceRemoved(this, EventArgs.Empty);}}//可以理解为数据接收后执行的函数private void OnReport(HidReport report){if (attached == false) return;if (report.Data.Length>6){//1-解析report.Data//2-解析成功的话if (true)GenerateEvents(report.Data[10]);}//为什么递归呀??//Console.WriteLine("调用了device.ReadReport(OnReport)");device.ReadReport(OnReport);}private void GenerateEvents(int arg){OnDataReceived(arg); }private void OnDataReceived(int arg){if (DataReceived != null)DataReceived(this, new CustomHIDEventArgs(arg));}... }
自定义的传上来的数据的解析,或者协议等等
public class CustomHIDEventArgs : EventArgs{public CustomHIDEventArgs(int arg){Arg = arg;}private int _arg;public int Arg { get => _arg; set => _arg = value; }}
}
主函数就很简单了
class Program{static MyHIDManager myHIDManager = new MyHIDManager();static void Main(string[] args){if (myHIDManager.OpenDevice()){myHIDManager.DeviceInserted += new EventHandler(usbInsertedFunc);myHIDManager.DeviceRemoved += new EventHandler(usbRemovedFunc);myHIDManager.DataReceived += new EventHandler<CustomHIDEventArgs>(usbDataReceiveFunc);Console.WriteLine("已经识别到USB ,按任意键退出");Console.ReadKey();myHIDManager.CloseDevice();}else{Console.WriteLine("未识别到USB ,按任意键退出");Console.ReadKey();}}private static void usbDataReceiveFunc(object sender, CustomHIDEventArgs e){Console.Write("已经收到USB HID设备发送的数据----");Console.WriteLine(e.Arg);}private static void usbRemovedFunc(object sender, EventArgs e){Console.WriteLine("我的USB HID 设备已经拔出");}private static void usbInsertedFunc(object sender, EventArgs e){Console.WriteLine("我的USB HID 设备已经插入");}}
3.运行结果
总结
水平有限,有不对的地方请大家批评指正。谢谢
STM32 USB 开发(二)HID Slave 通信 --- 简单上位机开发相关推荐
- C#实现串口通信的上位机开发
目录 上位机 串口通信 C#串口通信:SerialPort类 列出所有的串口 C#串口通信:读写数据 写数据: 读数据: DataReceived事件: 数据发送不同步问题: 界面设计 波形显示(ch ...
- 上位机软件开发流程是怎样的?上位机开发软件分享
随着科技的发展, 上位机软件开发已经成为当今社会的一个重要组成部分.上位机软件开发是一种技术,它可以帮助用户更好地控制和管理计算机系统.它可以帮助用户更有效地完成任务,提高工作效率,提高生产力. 上位 ...
- 遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题
遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题 Delphi / Windows SDK/API http://www.delphi2007.net/DelphiNetwork/ht ...
- “Xilinx ZYNQ+TCP通信+Python上位机”实现实时视频传输系统
笔者在CSDN的第一篇万字长文,请多多支持. 本文是笔者的公众号 IC设计者笔记 文章的转载.很多优质原创内容都会第一时间发布在公众号,欢迎关注公众号,一起交流学习.公众号后台回复"ZYNQ ...
- 【WPF】基于WPF的上位机开发模板
文章目录 一. 背景 二. 基于WPF的通用界面模板 三. WPF与python的协同开发 四. WPF模板代码路径 一. 背景 在嵌入式开发中,经常会写一些脚本来提高工作效率,在工作中发现,周围同事 ...
- C# | 上位机开发新手指南(一)概述
C#上位机开发新手指南(一)概述 文章目录 C#上位机开发新手指南(一)概述 前言 学习C#编程基础 熟悉上位机开发相关知识 选择合适的开发环境 熟练掌握C#编程技巧 掌握常用控件的使用方法 学习与硬 ...
- STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL)
STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL ) STM32的USB功能模块可以配置为虚拟串口(VCOM: Visual Port Com)或人机交互设备(HID: Hu ...
- java开发plc上位机软件开发_上位机开发之西门子PLC-S7通信实践
写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...
- 485通信原理_上位机开发之单片机通信实践
经常会有一些学员会问到上位机与单片机之间通信的问题,而我们经常会讲上位机与PLC之间通信,那么其实对上位机开发来说,不管是和PLC通信,还是和单片机通信,通信原理都是一样的.PLC的本质就是单片机,在 ...
最新文章
- 管理分布式session的四种方式。
- org.springframework.data.redis 一次连接获取特定key所有k-v(pipeline)
- 机器人布里茨说什么_LOL蒸汽机器人布里茨英雄介绍、技能加点、技巧攻略 机器人出什么装备...
- 数据分析——朴素贝叶斯原理示意图
- mysql之多列索引
- P2463-[SDOI2008]Sandy的卡片【SA,二分答案】
- spring 项目集成配置_Spring重试–与项目集成的方式
- 内核定时器timer_list使用
- 在Eclipse中使用Maven创建多模块的层级项目
- SSRF 漏洞危害大,应避免被利用攻击内网应用!| 原力计划
- ES6读书笔记(一)
- 【基础处理】基于matlab Fxlms算法有源噪声控制系统【含Matlab源码 1394期】
- displaytag 使用
- 【PDF提取内容重命名】咕嘎批量PDF批量提取PDF识别重命名,如何批量读取pdf内容并重命名,根据pdf内容修改文件名称,如何提取pdf标题为文件名,用电子发票为例教你操作方法
- u邮件收件服务器密码是什么,U-Mail邮件服务器加密技术给邮件上安全锁
- 单片机循迹车c语言程序,基于单片机控制的简易自动循迹小车仿真与程序源码...
- 区间缩放,标准化,归一化
- PTA L2-048 寻宝图
- C/C++ 如何构造出强悍的宏
- Andrew Ng 机器学习鸡尾酒音频分离算法解析