• 使用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

  • 相关阅读:
    WEB前端开发规范文档
    js九九乘法表
    阿里前端两年随想
    自动播放选项卡
    HTML+CSS编写规范
    简易秒表
    关于响应式布局
    关于PHP语言
    关于CSS3的小知识点之2D变换
    关于H5框架之Bootstrap的小知识
  • 原文地址:https://www.cnblogs.com/dengxiaojun/p/4357840.html
Copyright © 2020-2023  润新知