首页 > 其他分享 >USB通信

USB通信

时间:2024-10-29 10:21:52浏览次数:3  
标签:USB int HIDDevInfo CharSet 通信 CallingConvention public string

相关工具

  Bus Hound

  HidLib.dll  

      通过百度网盘分享的文件:通信
      链接:https://pan.baidu.com/s/1hsiSaMz0IW2TbnPWUT9-aA
      提取码:fvkt

动态库功能:

  • 枚举USB设备信息(设备路径、厂商id、产品id和设备序列号)
  • 根据设备路径,打开和关闭USB设备
  • 进行USB通信,即数据的收发

代码实现:

  说明:该代码不能直接运行,以下代码是winform的后台代码

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace HIDAssistance
{
    [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
    public struct HIDDevInfo
    {
        public string m_DevicePath;
        public ushort m_VendorID;
        public ushort m_ProductID;
        public string m_ManufacturerString;
        public string m_ProductString;
        public string m_SerialNumber;
    }

    public delegate int RECEIVE_CALLBACK(IntPtr recvData, int dlen);
    public partial class Form1 : Form
    {
        [DllImport("HidLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern int HID_EnumDevices();
        [DllImport("HidLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern IntPtr HID_GetHIDDevPath(int index);

        [DllImport("HidLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern int OpenHID(string index);

        [DllImport("HidLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern int CloseHID();

        [DllImport("HidLib.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        public static extern int write(byte[] buffer, UInt32 bytesToWrite, ref UInt32 bytesWritten);

        [DllImport("HidLib", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
        public static extern int SetFuncRecall(RECEIVE_CALLBACK receive);

        List<HIDDevInfo> lst = new List<HIDDevInfo>();
        public Form1()
        {
            InitializeComponent();
            int cnt = HID_EnumDevices();
            for (int i = 0; i < cnt; i++)
            {
                IntPtr pDevice = HID_GetHIDDevPath(i);
                HIDDevInfo obj = (HIDDevInfo)Marshal.PtrToStructure(pDevice, typeof(HIDDevInfo));
                lst.Add(obj);
                if (!string.IsNullOrEmpty(obj.m_DevicePath))
                {
                    comboBox1.Items.Add(obj.m_DevicePath);
                    textBox1.Text = obj.m_VendorID.ToString("X4");
                    textBox2.Text = obj.m_ProductID.ToString("X4");
                    if (comboBox1.Items.Count > 0)
                        comboBox1.SelectedIndex = 0;
                }
            }
        }

        public event RECEIVE_CALLBACK callBackEvt = null;
        private void button2_Click(object sender, EventArgs e)
        {
            callBackEvt = new RECEIVE_CALLBACK(recvCallBackFunc);
            SetFuncRecall(callBackEvt);
            string hidStr = comboBox1.Text;
            int ret=OpenHID(hidStr);
            if (ret != 0)
            {
                MessageBox.Show("fail!");
                return;
            }
            button2.Enabled = false;
            //HIDDevInfo[] arr = new HIDDevInfo[1];
            //int size = Marshal.SizeOf(typeof(HIDDevInfo));
            //IntPtr structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(HIDDevInfo)));

            //int nSize = 0;
            //IntPtr ret = HID_SearchHIDPath(ref nSize);
            //if (nSize > 0)
            //{
            //    //HIDDevInfo obj = (HIDDevInfo)Marshal.PtrToStructure(ret, typeof(HIDDevInfo));
            //    object obj = Marshal.PtrToStructure(ret, typeof(HIDDevInfo));

            //    Marshal.FreeHGlobal(ret);
            //}

        }

        public int recvCallBackFunc(IntPtr recvData, int dlen)
        {
            if (recvData != null && dlen > 0)
            {
                byte[] data = new byte[dlen];
                Marshal.Copy(recvData, data, 0, dlen);
                string str = BitConverter.ToString(data, 0, (int)dlen).Replace("-", "");
                this.Invoke((EventHandler)delegate
                {
                    richTextBox2.AppendText(str + "\n");
                    richTextBox2.SelectionStart = richTextBox2.Text.Length;
                    richTextBox2.ScrollToCaret();

                });
                return 0;
            }
            else
            {
                return -1;
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            int ret=CloseHID();
            if (ret != 0)
            {
                MessageBox.Show("fail!");
                return;
            }
            button2.Enabled = true;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            int bufLen;
            uint written = 0;
            byte[] buf = StringToHexByteArray(richTextBox1.Text);
            bufLen = buf.Length;
            write(buf, (uint)bufLen, ref written);
        }

        public static byte[] StringToHexByteArray(string hex)
        {
            if (hex.Length % 2 == 1)
                throw new Exception("The binary key cannot have an odd number of digits");

            int len = hex.Length >> 1;
            byte[] arr = new byte[len];

            for (int i = 0; i < len; ++i)
            {
                arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1])));
            }

            return arr;
        }

        public static int GetHexVal(char hex)
        {
            int val = (int)hex;
            return val - (val < 58 ? 48 : (val < 97 ? 55 : 87));
        }

        
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            int index = comboBox1.SelectedIndex;
            HIDDevInfo currentDev = lst[index];
            textBox1.Text = currentDev.m_VendorID.ToString("X4");
            textBox2.Text = currentDev.m_ProductID.ToString("X4");
        }

    }
}

实现效果

  略

标签:USB,int,HIDDevInfo,CharSet,通信,CallingConvention,public,string
From: https://www.cnblogs.com/ZM191018/p/18512315

相关文章

  • GaussDB关键技术方案_通信组件
    GaussDB关键技术方案_通信组件云原生数据库采用shareddisk架构,各个计算节点对等,计算节点之间通过页面交换实现缓存数据的一致性,为了提高页面传递的效率,需要利用RDMA或UB单边读写的能力;云原生数据库为了管理动态资源,需要对动态资源的owner分配进行加锁,分布式锁管理需要利用原子操......
  • 基于HAL库STM32F1虚拟串口(USB)通信、大端模式、结构体对齐
    虚拟串口收发函数、大端模式和小端模式、结构体对齐文章目录虚拟串口收发函数、大端模式和小端模式、结构体对齐前言一、发送函数二、接收函数三、大端模式与小端模式三、结构体对齐前言本文主要是在上一篇中的工程,使用虚拟串口遇到的一些问题:在发送数据直接找到......
  • IIC通信协议详解 & PCF8591应用(Verilog实现)
    该文章结合PCF85918-bitAD/DA模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易懂。该文图片均从PCF8591手册中截取,一定程度上引导读者学习阅读datasheet。1.PCF8591引脚2.功能介绍2.1地址位在I2C总线系统中,每个PCF8591设备都通过发送一个有效地址来激活。......
  • C# 使用SuperSocket的FixedHeaderReceiveFilter进行通信
    一、服务端publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){MyServerappServer=newMyServer();......
  • 无人机之自组网通信技术篇
       无人机的自组网通信技术是一种利用无人机作为节点,通过无线通信技术实现节点间自主组网、动态路由和数据传输的技术。一、技术原理与特点技术原理:无人机自组网技术基于自组织网络(Ad-HocNetwork)的原理,通过无线通信技术实现无人机之间的自主组网和通信。这种技术无需依......
  • 【物联网】物联网中常见的通信协议
    目录1、MQTT2、CoAP3、HTTP4、WebSocket5、ZigBee6、Bluetooth7、Z-Wave8、6LoWPAN9、LoRaWAN10、NB-IoT11、DDS12、AMQP13、DDS-RTPS14、Modbus15、OPCUA16、D-Bus17、EnOcean18、Thread19、Wi-Fi20、Ethernet/IP21、HyperCat22、MQTT-SN23、Sigfox2......
  • FreeRTOS同步互斥与通信(有缺陷的同步示例,有缺陷的互斥示例)
    同步互斥1.同步同步指的是协调多个线程或进程的执行顺序,以确保某些操作按预期的顺序进行。同步主要用于解决依赖关系的问题,确保线程之间的协调。目的:保证操作的顺序,确保某些条件成立前不进行后续操作。实现方式:信号量:控制访问共享资源的数量,可以限制同时访问的线......
  • Vue 插槽:组件通信的“隐形通道”
    在Vue中,插槽(slot)是实现组件内容分发的机制,允许我们将子组件的内容传递给父组件,从而提升组件的可复用性和灵活性。插槽的本质是通过将父组件内容传递到子组件指定的插槽位置,使得子组件在渲染时可以动态填充不同的内容。1. 插槽的类型Vue中有几种主要的插槽类型:1、默认插......
  • 第六届国际科技创新学术交流大会 暨通信、信息系统和软件工程学术会议(CISSE 2024)
    @目录一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题一、会议详情二、重要信息大会官网:https://ais.cn/u/vEbMBz提交检索:EICompendex、IEEEXplore、Scopus大会时间:2024年12月6-8日大会地点:中国-广州三、大会介绍通信、信息系统与软件工程学术会议(CI......
  • STM32--I2C通信
    对于I2C通信会分为两大块来讲解,第一块,就是介绍协议规则,然后用软件模拟的形式来实现协议,第二块,就是介绍STM32的12C外设,然后用硬件来实现协议,因为12C是同步时序,软件模拟协议也非常方便。在学12C之前,我们已经学习了串口通信,串口通信,就是从TX引脚向RX引脚发送数据流,数据流......