zoukankan      html  css  js  c++  java
  • 使用LIBUSB实现和自定义通讯设备通讯--MFC代码在末尾

    LIBUSB是一款简单好用的USB通讯开发库,一般HID设备用该库通讯能大大降低开发周期,使用如下,首先需要为设备安装驱动

    在libusb的bin目录下有一个inf_wirzed.exe的文件,该文件是生成驱动所用,具体步骤可以网上百度,很是傻瓜式操作,安装好驱动之后就可以使用其通讯函数了,

    安装好驱动之后的情况如下

    使用visual studio开发,将lib_msvc目录下的libusb.lib文件添加到工程目录并将lusb0_usb.h文件加入工程,如下

     

    之后在MFC工程中如下操作

    OnInitDialog方法中调用usb_init函数,这是初始化函数库的,每个工程需要而且仅仅需要初始化一次.

    查找系统中全部USB的方法如下

    usb_find_busses();

    usb_find_devices();//重新寻找设备

     

    for (bus = usb_get_busses(); bus; bus = bus->next)

    {

        for (dev = bus->devices; dev; dev = dev->next)

        {

            usbCount++;

            deviceName.Empty();

            handle = usb_open(dev);

            usb_get_string_simple(handle,dev->descriptor.iProduct,nameBuffer,128);

            usb_close(handle);

            pidBuffer[usbCount-1] = dev->descriptor.idProduct;//枚举所有设备

            vidBuffer[usbCount-1] = dev->descriptor.idVendor;

            pvnBuffer[usbCount-1] = dev->descriptor.bcdDevice;

            deviceName.AppendFormat("%s",nameBuffer);

            ((CComboBox*)GetDlgItem(IDC_COMBO_USB_DEVICE_ENMU))->AddString(deviceName);

        }

    }

     

    打开usb设备的方法如下

    //现在遍历全部设备,找到对应PID vid的设备打开

    usb_find_busses();

    usb_find_devices();//重新寻找设备

     

    for (bus = usb_get_busses(); bus; bus = bus->next)

    {

        for (dev = bus->devices; dev; dev = dev->next)

        {

            if(dev->descriptor.idProduct == myPid && dev->descriptor.idVendor)

            {

                //PID VID相同

                usb_handle = usb_open(dev);

            }

        }

    }

     

    发送数据的方法

    char sendBuffer[64] = {0};

    CString sendString;

    GetDlgItem(IDC_EDIT_USB_SEND_MESSAGE)->GetWindowText(sendString);

    for(int i = 0; i < 64; i++)

    {

        if(i >= sendString.GetLength())sendBuffer[i] = 0;

        else

        {

            sendBuffer[i] = sendString.GetAt(i);

        }

    }

    usb_claim_interface(usb_handle, 0);//默认设备

    usb_interrupt_write(usb_handle,0x01,sendBuffer,64,100);

    usb_release_interface(usb_handle, 0);

     

    接收数据的方法

    char receiveBuffer[64] = {0};

    CString receiveString;

    int recvCount = 0;

    usb_claim_interface(usb_handle, 0);//默认设备

    recvCount = usb_interrupt_read(usb_handle,0x81,receiveBuffer,64,100);

    usb_release_interface(usb_handle, 0);

    if(recvCount > 0)

    {

        GetDlgItem(IDC_EDIT_USB_RECV_SHOW)->GetWindowText(receiveString);

        for(int i = 0; i < recvCount; i++)

        {

            receiveString.AppendChar(receiveBuffer[i]);

        }

        GetDlgItem(IDC_EDIT_USB_RECV_SHOW)->SetWindowText(receiveString);

     

    每次发送和接手之前需要调用usb_claim_interface将函数库和操作系统关联起来

    有了这些基本方法,通讯应该就不成问题了

    详细代码见链接

     http://download.csdn.net/detail/dengrengong/8523587

  • 相关阅读:
    C++类构造函数初始化列表
    VC++检测硬件设备状态
    MFC中调用Windows API函数的方式
    DEBUG无法进入断点解决方法
    【转】c++数组初始化
    vc++实现控制USB设备启用与否
    3d图像坐标轴及css3属性的讲解
    Ajax的兼容及Ajax的缓存问题
    Ajax中最有名axios插件(只应用于Ajax)(post方法,官网写错了,应是字符串格式)
    文档碎片及xml讲解
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4357840.html
Copyright © 2011-2022 走看看