QT编写USB PRINTER驱动

该USB驱动,为电脑对识别到USB打印机的驱动,最初采用LIBUSB,发现该功能不好用,不能够进行数据读写。后采用WINDOWS的接口函数,进行读写,具体代码如下:

1、usb_interface.h

#ifndef USB_INTERFACE_H
#define USB_INTERFACE_H

#include <QObject>
#include <windows.h>

typedef struct
{
    bool    SearchUSB;              //是否搜索到了usb
    bool    UsbOpen;                //usb是否打开
}_USB_VAR;

extern _USB_VAR  USB_Var;

class Usb_Interface
{
public:
    Usb_Interface();
    bool Usb_Exsit(uint16_t vid, uint16_t pid);     //获取列表信息
    bool Usb_Open(uint16_t vid, uint16_t pid);           //打开usb
    bool Usb_Close(void);          //关闭usb
    bool Usb_Data_Send(LPCVOID lpBuffer, DWORD dwSize);        //数据发送
    bool Usb_Data_Read(LPVOID lpBuffer, DWORD dwSize);       //数据接收
};

#endif // USB_INTERFACE_H

2、usb_interface.cpp

#include "usb_interface.h"
#include <QDebug>

#include "windows.h"
#include <iostream>

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <usbioctl.h>


extern "C"{
#include <hidsdi.h>
#include <setupapi.h>
#include <hidsdi.h>
#include <usbprint.h>
#include <initguid.h>
#include <fileapi.h>
#include "usbscan.h"
}


using namespace std;

_USB_VAR  USB_Var;
HANDLE      hUsb = INVALID_HANDLE_VALUE;
char        DeviceName[MAX_PATH];
OVERLAPPED  overlap;

Usb_Interface::Usb_Interface()
{

}



//USB获取当前的设备信息
bool Usb_Interface::Usb_Exsit(uint16_t vid,uint16_t pid)
{
//    uint8_t vid_buf[8];
//    uint8_t pid_buf[8];

//    //vid & pid 组合成字符串
//    sprintf((char *)(&vid_buf[0]),"vid_%04x",vid);
//    sprintf((char *)(&pid_buf[0]),"pid_%04x",pid);

    // Get handle to the devices
    HDEVINFO  hInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVINTERFACE_USBPRINT, NULL, NULL,
                                     DIGCF_PRESENT |  DIGCF_INTERFACEDEVICE);

    if (hInfo == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    SP_INTERFACE_DEVICE_DATA Interface_Info;
    Interface_Info.cbSize = sizeof(Interface_Info);     // Enumerate device
    if (!SetupDiEnumInterfaceDevice(hInfo, NULL, (LPGUID) &GUID_DEVINTERFACE_USBPRINT,0, &Interface_Info))
    {
        SetupDiDestroyDeviceInfoList(hInfo);
        return false;
    }

    DWORD needed;                                       // get the required length
    SetupDiGetInterfaceDeviceDetail(hInfo, &Interface_Info, NULL, 0, &needed, NULL);
    PSP_INTERFACE_DEVICE_DETAIL_DATA detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc(needed);
    if (!detail)
    {
        SetupDiDestroyDeviceInfoList(hInfo);
        return false;
    }
                                                        // fill the device details
    detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
    if (!SetupDiGetInterfaceDeviceDetail(hInfo, &Interface_Info, detail, needed,NULL, NULL))
    {
        free((PVOID) detail);
        SetupDiDestroyDeviceInfoList(hInfo);
        return false;;
    }


    char *ptr = (char *)(detail->DevicePath);
    memset(DeviceName,0x00,MAX_PATH);
    for(int i = 0; i<MAX_PATH; i++)
    {
        DeviceName[i] =  ptr[i] ;
        if('}' == DeviceName[i])
        {
            break;
        }
    }
    free((PVOID) detail);
    SetupDiDestroyDeviceInfoList(hInfo);


//    for(int i = 0; i<MAX_PATH; i++)
//    {
//        qDebug() << DeviceName[i];
//    }


    //判断是否是要找的VID & PID
//    if(! strstr((char *)(&DeviceName[0]),(char *)(&vid_buf[0])))
//    {
//        return false;
//    }

    return true;
}


//打开USB
bool  Usb_Interface::Usb_Open(uint16_t vid,uint16_t pid)
{
    UINT success;
    int siz, nBytes;

    memset(&overlap, 0, sizeof(overlap));

    //搜索设备
    if(! Usb_Exsit(vid,pid))
    {
        return false;
    }

    //读VID和PID
    hUsb = CreateFile((LPCWSTR)(DeviceName),
                      GENERIC_READ | GENERIC_WRITE,
                      FILE_SHARE_WRITE | FILE_SHARE_READ,
                      NULL,
                      OPEN_EXISTING,
                      FILE_FLAG_OVERLAPPED,
                      NULL);

    if(hUsb == INVALID_HANDLE_VALUE )
    {
        return false;
    }


    USB_Var.UsbOpen = true;

    return true;
}

//关闭USB
bool  Usb_Interface::Usb_Close(void)
{
    if(INVALID_HANDLE_VALUE != hUsb )
    {
        CloseHandle(hUsb);
    }

    hUsb = INVALID_HANDLE_VALUE;

    USB_Var.UsbOpen = false;

    return true;
}

//usb数据发送
bool Usb_Interface::Usb_Data_Send(LPCVOID lpBuffer, DWORD dwSize)
{
    UINT success;
    int  nBytes;
    DWORD numread;

    //如果非法句柄  则不能用
    if(INVALID_HANDLE_VALUE == hUsb )
    {
        return false;
    }

    success = WriteFile(hUsb,lpBuffer,dwSize,(PULONG) &nBytes,&overlap);

    //状态判断
    if (success)
    {
        return true;
    }
    else
    {
         if (GetLastError() == ERROR_IO_PENDING)
         {
               WaitForSingleObject(hUsb,800);
               success = GetOverlappedResult(hUsb, &overlap,  &numread,  FALSE);
         }
         else
         {
               return false;
         }
    }

//    qDebug() << "Send Success: " << success;

    return true; 
}

//usb数据接收
bool Usb_Interface::Usb_Data_Read(LPVOID lpBuffer, DWORD dwSize)
{
    UINT success;
    int  nBytes;
    DWORD numread;

    //如果非法句柄  则不能用
    if(INVALID_HANDLE_VALUE == hUsb )
    {
        return false;
    }

    success = ReadFile(hUsb,lpBuffer,dwSize,(PULONG) &nBytes,&overlap);

    //状态判断
    if (success)
    {
        return true;
    }
    else
    {
         if (GetLastError() == ERROR_IO_PENDING)
         {
             WaitForSingleObject(hUsb,500);
             success = GetOverlappedResult(hUsb, &overlap,  &numread,  FALSE);
         }
         else
         {
             return false;
         }
    }

//  qDebug() << "read Success: " << success;

    return success;
}

理论上,该接口不光支持USB PRINTER,还支持其它USB类型的数据传输。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
USB/IP服务器打印机是一种通过网络连接的打印机设备。它通过将USB接口转换为IP网络协议,使得用户可以通过网络将打印任务发送到打印机进行打印。 USB/IP服务器打印机的工作原理如下:首先,将支持USB接口的打印机连接到USB/IP服务器设备。然后,将USB/IP服务器设备连接到局域网或互联网,使得用户可以通过网络访问该设备。当用户需要打印文件时,他们可以将文件发送到USB/IP服务器设备,然后设备将文件传递给打印机进行打印。 使用USB/IP服务器打印机有一些优势。首先,它允许用户通过网络远程访问打印机,使得用户可以方便地在不同的地点使用打印设备。其次,USB/IP服务器打印机可以解决USB接口数量有限的问题,因为通过网络连接,多个用户可以共享同一个打印机设备。此外,USB/IP服务器打印机也可以节省成本,因为只需要购买一个打印机设备,多个用户就可以共享使用。 然而,USB/IP服务器打印机也有一些限制。首先,打印任务的传输速度可能会受到网络带宽的限制,从而影响打印速度。其次,设备的兼容性也需要考虑,因为不是所有的打印机设备都支持USB/IP服务器功能。此外,网络连接的稳定与速度也可能会影响打印任务的传输与打印质量。 总的来说,USB/IP服务器打印机是一种便于远程访问和共享打印任务的打印设备。它可以通过网络连接实现用户之间的打印任务共享,提高工作效率和便利性。然而,需要考虑网络连接的稳定性和速度,以及设备的兼容性,以确保打印任务的顺利进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值