USB小票打印解決辦法

轉載的:https://blog.csdn.net/ghs79/article/details/46543845java

\?\USB#VID_8866&PID_0100#0001B0000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}python

USB小票打印解決辦法 
1、須要驅動,無需更改程序編程

安裝USB打印驅動,而後共享打印機,經過 「\\計算機\打印機名」的形式,按端口方式寫。
  • 1

2、直接寫USB端口,無需驅動,但須要改程序。windows

一、USB端口的形式如:\\?\usb#vid_0483&pid_5720#11101800002#{a5dcbf10-6530-11d2-901f-00c04fb951ed}。

     1.一、順便說下:在我測試過程當中,發現同一臺小票打印機,在不一樣電腦上顯示的端口名稱是同樣的。

     1.二、根據查的資料推斷,同一型號的打印機名稱應該是固定的(沒有證明)。

 二、用串口與電腦通訊,實現數據的發送。

     2.一、本人改了網上的SPcomm控件,以支持COM10以上的端口和USB端口。在CreateFile中產生影響。

 三、提供DEMO和控件源碼。

    3.一、DEMO中能夠檢測USB打印機的名稱:先打開程序,再插入USB打印機。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

下載地址:http://download.csdn.net/detail/ghs79/8818157api

利用標籤設計軟件作好模板,打印至本地文件,把其中的ZPL、EPL指令拷貝出來,替換其中動態變化的內容爲變量名,作成一個模板文本,在代碼中動態替換變量,再把指令輸出至打印機。緩存

windows下如何用cmd命令調用USB打印機打印

本覺得這種命令應該很簡單就能搜索到……實際上卻花了好一會時間才查到,並且仍是一個稍稍麻煩的方法app

1.打印機ide

首先, 我是用的是usb打印機, 在使用前還要安裝相應產品的驅動,正常鼠標操做打印時沒有問題的函數

2.確認計算機的全名工具

此電腦->屬性->高級系統設置->計算機名->計算機全名(等會的cmd命令要用) 
(因爲系統的差別, 可能有些不同,但老是能找到的)

3.將打印機設置爲共享, 確認打印機共享名

設置->設備->打印機和掃描儀->打印機屬性->共享->勾選共享這臺打印機 
(仍是那句話……因爲系統的差別, 可能有些不同,但老是能找到的) 
確認下打印機的共享名(等會的cmd命令要用)

4.打印

print /d:\計算機全名\打印機共享名 文檔 
如: 
print /d:\LAPTOP-SLG4Q8MV\DASCOM 1.txt 
print /d:\CAIPENG-PC\GP-L80180 123.txt

ESC_POS無驅動USB打印機

ESC_POS無驅動USB打印機 
下面的這個程序可使用: 
https://download.csdn.net/download/xjkstar/7245239

你好,我手頭有一個GP-L80180 打印機,我想在PC上 用VC編程 經過USB 控制這個打印機,大家給我發了一個《80開發包》, 
裏面的 PosdllDemo_VC.exe 經過串口能夠打印, 
可是經過USB口不能夠打印,能不能提供一個經過USB打印的 演示工具,最好是C或者C++的,有源碼的

使用Win32 API打印原始數據(強烈建議)。

這但是微軟的方法啊,不用在系統添加任何文件,同時又能保證打印機的正常使用,因此強烈建議。
參照:http://support.microsoft.com/kb/138594
  • 1
  • 2

下載下來:rawprn.exe 
解壓出來:rawprint 工程: 
這裏寫圖片描述 
運行以下指令:

RawPrint.exe GP-L80180 123.txt
  • 1

GP-L80180 是打印機 共享出來的 名字 
輸出:

Attempting to send file [123.txt] to printer [GP-L80180].
Data sent to printer.
  • 1
  • 2

123.txt中的內容爲:

\x0D\x1B\x40
OK打印完成
\x1D\x56\x41\x00
  • 1
  • 2
  • 3

利用樹莓派完成熱敏打印機的無驅打印

http://www.javashuo.com/article/p-ujidylmz-mc.html 
wget http://python-escpos.googlecode.com/files/python-escpos-1.0.tgz

Java 實現 POS 打印機無驅打印 
https://www.ibm.com/developerworks/cn/java/j-lo-pos/

sudo pip install python-escpos

不要驅動,簡單粗暴的用樹莓派驅動USB打印機 
https://blog.csdn.net/huayucong/article/details/53750463

參考代碼:

// ConsoleApplication1.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include <windows.h>
#include <string>
#include <IOSTREAM>
#include <winioctl.h>
#include <setupapi.h>

#pragma comment(lib, "setupapi.lib")

using namespace std;

typedef struct DataInfo
{
    string Port;  //串口端口號
    int BawdRate;//波特率
    int DataBits;  //數據位
    char Parity;  //校驗位
    int ReceiveBuffer;  //緩衝區
    int StopBits;//中止位
}PrintDevice;

// SetupDiGetInterfaceDeviceDetail所須要的輸出長度,定義足夠大
#define INTERFACE_DETAIL_SIZE    (1024)

//設備數量上限,假設16臺上限
#define MAX_DEVICE 16



//USB類的GUID
const GUID USB_GUID = {0xa5dcbf10, 0x6530, 0x11d2, {0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed}};

HANDLE hPort=NULL;  //句柄

//封裝的打印函數
int WriteData(string meg);
//打印內容
bool OnWriteData(string meg, bool bBold = false, bool bDTall = false, bool bDWide = false, int nHAil = 1);
//連接設備
int InitPort(PrintDevice &device);
//參數初始化
void InitializeDevicePar(PrintDevice &device);
//找設備
int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath);

int _tmain(int argc, _TCHAR* argv[])
{
//////////////////////////////////////////////////////////////////////////////////////////////////
//遍歷USB設備,找到POS打印機路徑
    int i, nDevice;
    char* szDevicePath[MAX_DEVICE];        // 設備路徑

    // 分配須要的空間
    for (i = 0; i < MAX_DEVICE; i++)
    {
        szDevicePath[i] = new char[256];
    }

    // 取設備路徑
    nDevice = GetDevicePath((LPGUID)&USB_GUID, szDevicePath);
//  GUID_CLASS_USB_DEVICE;
//////////////////////////////////////////////////////////////////////////////////////////////////
    i = 0;
    while (i < nDevice)
    {
        PrintDevice device;
        InitializeDevicePar(device);  //初始化打印機參數

        device.Port = szDevicePath[i++];

        printf("device.Port = %s\n",device.Port.c_str());

        InitPort(device);  //初始化打印機端口

        string s;

////////////////////////////打印頭信息開始//////////////////////////////////
        OnWriteData("*****Now You See Me*****\n\n",true, true, true);

        OnWriteData("- - - - - - - - - - - - - - - -\n");

        OnWriteData("So You Want?\n",false, true);

        OnWriteData("- - - - - - - - - - - - - - - -\n");

        OnWriteData("這是一個基於ESC_POS打印機的USB無驅動打印Demo\n",true, true, true);

        OnWriteData("我找到了你的電腦上全部的USB打印機\n",true, true, true, 2);

        OnWriteData("而後給全部找到的打印機發送打印命令\n", true, true, true, 3);

        OnWriteData("* * * * * * * * * * * * * * * *\n");

        OnWriteData("OK打印完成\n\n",false, false, true, 2);

        s = "\x1D\x56\x41\x00";
        WriteData(s);

        CloseHandle(hPort);//關閉端口
     }
 // 釋放空間
    for (i = 0; i< MAX_DEVICE; i++)
    {
        delete szDevicePath[i];
    }

    return 0;
}

//初始化參數
void InitializeDevicePar(PrintDevice &device)
{
    device.Port="COM4";
    device.BawdRate=9600;
    device.DataBits=8;
    device.StopBits=ONESTOPBIT;
    device.Parity=NOPARITY;  //NONE
    device.ReceiveBuffer=256;
}

//連接打印機
int InitPort(PrintDevice &device)
{
    hPort = CreateFile(device.Port.c_str(), GENERIC_READ | GENERIC_WRITE,
        0, NULL, 
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, NULL );

    if (hPort == INVALID_HANDLE_VALUE) 
    {   // 打開端口失敗
        return false;
    }
    else 
    { 

        printf("InitPort Hello\r\n");

        //設置端口緩衝
        SetupComm(hPort, 1024, 1024); 

        // 設定通信端口超時參數
        COMMTIMEOUTS tmouts;
        tmouts.ReadIntervalTimeout = 100;
        tmouts.ReadTotalTimeoutMultiplier = 100;
        tmouts.ReadTotalTimeoutConstant = 100;
        tmouts.WriteTotalTimeoutConstant = 100;
        tmouts.WriteTotalTimeoutMultiplier = 100;
        SetCommTimeouts(hPort, &tmouts);

        //設定通信端口通信參數
        DCB dcb;
        BOOL bol = TRUE;

        //dcb.DCBlength = sizeof(dcb);
        bol=GetCommState(hPort, &dcb);
        dcb.BaudRate = device.BawdRate;
        dcb.ByteSize =device.DataBits;
        dcb.StopBits = device.StopBits;
        dcb.Parity = device.Parity;

        bol = SetCommState(hPort, &dcb); //配置串口
        // 清除通信端口緩存
        PurgeComm(hPort, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT);

        // 初始化重疊IO對象
        OVERLAPPED m_OverlappedRead;
        OVERLAPPED m_OverlappedWrite;
        HANDLE m_hStopCommEvent;
        HANDLE m_hDataReady;
        memset(&m_OverlappedRead, 0, sizeof(OVERLAPPED));
        m_OverlappedRead.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
        memset(&m_OverlappedWrite, 0, sizeof(OVERLAPPED));
        m_OverlappedWrite.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

        // 初始化事件對象
        m_hStopCommEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        m_hDataReady = CreateEvent(NULL, FALSE, FALSE, NULL);

        //初始化打印ESC @
        DWORD iBytesLength;
        char chInitCode[] = "\x0D\x1B\x40";
        if (!WriteFile(hPort, chInitCode, (DWORD)3L, &iBytesLength, NULL))
            return false;
    }

    return true;
}

int   WriteData(string meg)
{
    DWORD dwWrite;
    return WriteFile(hPort, meg.c_str(), (DWORD)meg.length(), &dwWrite, NULL);
}

//打印數據,meg打印字符串,bBold=true粗體,nZoom=2大一號字體, nHAil=2居中對齊,nHAil=3右對齊。部分打印機可能中文字體設置無效,請加上FS !命令設置中文字體。
bool OnWriteData(string meg, bool bBold, bool bDTall, bool bDWide, int nHAil)
{
    char s[120] = "";
    memset(s, 0, 120);

    long nMode = 0;
    DWORD iBytesLength;

    if (bBold)
        nMode += 8;

    if (bDTall)
        nMode += 16;

    if (bDWide)
        nMode += 32;

    if (nMode > 0)
    {
        sprintf(s, "\x1B\x21%c", nMode);

        if (strlen(s) < 3)
        {
            iBytesLength = 0;
            WriteFile(hPort, s, (DWORD)3L, &iBytesLength, NULL);
        }
        else
            WriteData(s);
    }

    switch (nHAil)
    {
    case 1:
        break;
    case 2:
        strcat(s, "\x1B\x61\x01");
        WriteData(s);
        break;
    case 3:
        strcat(s, "\x1B\x61\x02");
        WriteData(s);
        break;
    default:
        break;
    }

    WriteData(meg);

    iBytesLength = 0;
    strcpy(s, "\x1B\x21\x00");
    WriteFile(hPort, s, (DWORD)3L, &iBytesLength, NULL);

    return true;
};

////////////////////////////////////////////////////////////////////////////////////////////////////////
//獲取CreateFile的USB端口號
////////////////////////////////////////////////////////////////////////////////////////////////////////

// 根據GUID得到設備路徑
// lpGuid: GUID指針
// pszDevicePath: 設備路徑指針的指針,用於返回找到的路徑
// 返回: 成功獲得的設備路徑個數,可能不止1個
int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
{
    HDEVINFO hDevInfoSet;
    SP_DEVINFO_DATA spDevInfoData;
    SP_DEVICE_INTERFACE_DATA ifData;
    PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
    int nCount;
    int nTotle;
    BOOL bResult;

    char* strUSBPrint = "USB 打印支持";

    // 取得一個該GUID相關的設備信息集句柄
    hDevInfoSet = ::SetupDiGetClassDevs(lpGuid,     // class GUID 
        NULL,                    // 無關鍵字 
        NULL,                    // 不指定父窗口句柄 
        DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    // 目前存在的設備

    // 失敗...
    if (hDevInfoSet == INVALID_HANDLE_VALUE)
    {
        return 0;
    }

    // 申請設備接口數據空間
    pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);

    pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

    nTotle = -1;
    nCount = 0;
    bResult = TRUE;

    // 設備序號=0,1,2... 逐一測試設備接口,到失敗爲止
    while (bResult)
    {
        nTotle++;
        spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);

        // 枚舉符合該GUID的設備接口
        bResult = ::SetupDiEnumDeviceInfo(
            hDevInfoSet,     // 設備信息集句柄
            (ULONG)nTotle,   // 設備信息集裏的設備序號
            &spDevInfoData);        // 設備接口信息

        if (bResult)
        {
            DWORD DataT ;
            TCHAR buf[MAX_PATH];
            DWORD nSize = 0;

            // get Friendly Name or Device Description
            if ( SetupDiGetDeviceRegistryProperty(hDevInfoSet, &spDevInfoData, 
                SPDRP_FRIENDLYNAME, &DataT, (PBYTE)buf, sizeof(buf), &nSize) ) {
            } else if ( SetupDiGetDeviceRegistryProperty(hDevInfoSet, &spDevInfoData, 
                SPDRP_DEVICEDESC, &DataT, (PBYTE)buf, sizeof(buf), &nSize) ) {
            } else {
                lstrcpy(buf, _T("Unknown"));
            }

            //是不是要找的設備類型
            if (strcmp(buf, strUSBPrint) != 0)
                continue;

            ifData.cbSize = sizeof(ifData);

            // 枚舉符合該GUID的設備接口
            bResult = ::SetupDiEnumDeviceInterfaces(
                hDevInfoSet,     // 設備信息集句柄
                NULL,            // 不需額外的設備描述
                lpGuid,          // GUID
                (ULONG)nTotle,   // 設備信息集裏的設備序號
                &ifData);        // 設備接口信息

            if (bResult)
            {
                // 取得該設備接口的細節(設備路徑)
                bResult = SetupDiGetInterfaceDeviceDetail(
                    hDevInfoSet,    // 設備信息集句柄
                    &ifData,        // 設備接口信息
                    pDetail,        // 設備接口細節(設備路徑)
                    INTERFACE_DETAIL_SIZE,    // 輸出緩衝區大小
                    NULL,           // 不需計算輸出緩衝區大小(直接用設定值)
                    NULL);          // 不需額外的設備描述

                if (bResult)
                {
                    // 複製設備路徑到輸出緩衝區
                    ::strcpy_s(pszDevicePath[nCount], 256,pDetail->DevicePath);  
                    // 調整計數值
                    nCount++;
                }
            }
        }
    }

    // 釋放設備接口數據空間
    ::GlobalFree(pDetail);

    // 關閉設備信息集句柄
    ::SetupDiDestroyDeviceInfoList(hDevInfoSet);

    return nCount;
}
相關文章
相關標籤/搜索