轉載的:https://blog.csdn.net/ghs79/article/details/46543845java
\?\USB#VID_8866&PID_0100#0001B0000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}python
USB小票打印解決辦法
1、須要驅動,無需更改程序編程
安裝USB打印驅動,而後共享打印機,經過 「\\計算機\打印機名」的形式,按端口方式寫。
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打印機。
下載地址:http://download.csdn.net/detail/ghs79/8818157api
利用標籤設計軟件作好模板,打印至本地文件,把其中的ZPL、EPL指令拷貝出來,替換其中動態變化的內容爲變量名,作成一個模板文本,在代碼中動態替換變量,再把指令輸出至打印機。緩存
本覺得這種命令應該很簡單就能搜索到……實際上卻花了好一會時間才查到,並且仍是一個稍稍麻煩的方法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打印機
下面的這個程序可使用:
https://download.csdn.net/download/xjkstar/7245239
你好,我手頭有一個GP-L80180 打印機,我想在PC上 用VC編程 經過USB 控制這個打印機,大家給我發了一個《80開發包》,
裏面的 PosdllDemo_VC.exe 經過串口能夠打印,
可是經過USB口不能夠打印,能不能提供一個經過USB打印的 演示工具,最好是C或者C++的,有源碼的
這但是微軟的方法啊,不用在系統添加任何文件,同時又能保證打印機的正常使用,因此強烈建議。 參照:http://support.microsoft.com/kb/138594
下載下來:rawprn.exe
解壓出來:rawprint 工程:
運行以下指令:
RawPrint.exe GP-L80180 123.txt
GP-L80180 是打印機 共享出來的 名字
輸出:
Attempting to send file [123.txt] to printer [GP-L80180]. Data sent to printer.
123.txt中的內容爲:
\x0D\x1B\x40 OK打印完成 \x1D\x56\x41\x00
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; }