文章目录

  • 前言
  • 一、准备数据
  • 二、在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 通信 --- 简单上位机开发相关推荐

  1. C#实现串口通信的上位机开发

    目录 上位机 串口通信 C#串口通信:SerialPort类 列出所有的串口 C#串口通信:读写数据 写数据: 读数据: DataReceived事件: 数据发送不同步问题: 界面设计 波形显示(ch ...

  2. 上位机软件开发流程是怎样的?上位机开发软件分享

    随着科技的发展, 上位机软件开发已经成为当今社会的一个重要组成部分.上位机软件开发是一种技术,它可以帮助用户更好地控制和管理计算机系统.它可以帮助用户更有效地完成任务,提高工作效率,提高生产力. 上位 ...

  3. 遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题

    遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题 Delphi / Windows SDK/API http://www.delphi2007.net/DelphiNetwork/ht ...

  4. “Xilinx ZYNQ+TCP通信+Python上位机”实现实时视频传输系统

    笔者在CSDN的第一篇万字长文,请多多支持. 本文是笔者的公众号 IC设计者笔记 文章的转载.很多优质原创内容都会第一时间发布在公众号,欢迎关注公众号,一起交流学习.公众号后台回复"ZYNQ ...

  5. 【WPF】基于WPF的上位机开发模板

    文章目录 一. 背景 二. 基于WPF的通用界面模板 三. WPF与python的协同开发 四. WPF模板代码路径 一. 背景 在嵌入式开发中,经常会写一些脚本来提高工作效率,在工作中发现,周围同事 ...

  6. C# | 上位机开发新手指南(一)概述

    C#上位机开发新手指南(一)概述 文章目录 C#上位机开发新手指南(一)概述 前言 学习C#编程基础 熟悉上位机开发相关知识 选择合适的开发环境 熟练掌握C#编程技巧 掌握常用控件的使用方法 学习与硬 ...

  7. STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL)

    STM32 USB VCOM和HID的区别,配置及Echo功能实现(HAL ) STM32的USB功能模块可以配置为虚拟串口(VCOM: Visual Port Com)或人机交互设备(HID: Hu ...

  8. java开发plc上位机软件开发_上位机开发之西门子PLC-S7通信实践

    写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...

  9. 485通信原理_上位机开发之单片机通信实践

    经常会有一些学员会问到上位机与单片机之间通信的问题,而我们经常会讲上位机与PLC之间通信,那么其实对上位机开发来说,不管是和PLC通信,还是和单片机通信,通信原理都是一样的.PLC的本质就是单片机,在 ...

最新文章

  1. 管理分布式session的四种方式。
  2. org.springframework.data.redis 一次连接获取特定key所有k-v(pipeline)
  3. 机器人布里茨说什么_LOL蒸汽机器人布里茨英雄介绍、技能加点、技巧攻略 机器人出什么装备...
  4. 数据分析——朴素贝叶斯原理示意图
  5. mysql之多列索引
  6. P2463-[SDOI2008]Sandy的卡片【SA,二分答案】
  7. spring 项目集成配置_Spring重试–与项目集成的方式
  8. 内核定时器timer_list使用
  9. 在Eclipse中使用Maven创建多模块的层级项目
  10. SSRF 漏洞危害大,应避免被利用攻击内网应用!| 原力计划
  11. ES6读书笔记(一)
  12. 【基础处理】基于matlab Fxlms算法有源噪声控制系统【含Matlab源码 1394期】
  13. displaytag 使用
  14. 【PDF提取内容重命名】咕嘎批量PDF批量提取PDF识别重命名,如何批量读取pdf内容并重命名,根据pdf内容修改文件名称,如何提取pdf标题为文件名,用电子发票为例教你操作方法
  15. u邮件收件服务器密码是什么,U-Mail邮件服务器加密技术给邮件上安全锁
  16. 单片机循迹车c语言程序,基于单片机控制的简易自动循迹小车仿真与程序源码...
  17. 区间缩放,标准化,归一化
  18. PTA L2-048 寻宝图
  19. C/C++ 如何构造出强悍的宏
  20. Andrew Ng 机器学习鸡尾酒音频分离算法解析

热门文章

  1. 2020年中国废旧纺织品回收行业市场现状分析,高值化再生技术持续推进「图」
  2. Adobe Premiere Pro CC 2018 剪裁音频文件攻略
  3. Android 中设置指定语言
  4. 反射在Java编程中的应用
  5. 《一本书读懂财报》学习笔记 - 资产是如何计价?
  6. 海洋cms单本小说网站模板
  7. [转] 两篇关于flash 职业和webgame的文章
  8. 汇编实现数字的输入与输出
  9. STM32F103 485通信开发实例
  10. Burpsuite的基本使用介绍