佳博 GP-L80180 USB ESCPOS VC 开发
手頭有一個佳博 GP-L80180 熱敏打印機,該打印機有USB口 ,串口。
給的例子,串口通了,通過USB口,安裝驅動之后,也可以打印測試頁。
但是用VC程序 通過系統(tǒng)驅動打印的方式 ,不是很熟悉。
參考 ESPON 的一些例程,直接通過USB接口,發(fā)送ESCPOS指令給打印機。
下面是開發(fā)的過程的記錄。
1.通過USB線 連接到PC,我的系統(tǒng)是win7 64位。
在設備管理器里面,
如果PC系統(tǒng)是英文版的,應該是叫另外一個名字:USB PRINTING SUPPORT,這個地方不確定。
使用BUS HOUND 查看打印機 USB接口
通過其他網友提供的工具,得到其GUID:
\?\USB#VID_8866&PID_0100#0001B0000000#{a5dcbf10-6530-11d2-901f-00c04fb951ed}下面開始第一步,對該USB設備進行枚舉,首先找到這個設備,然后再打開。
使用vs2013 創(chuàng)建一個 win32 console 控制臺工程:命名為GPL80_ESCPOS_USB
默認使用的字符集為:使用 Unicode 字符集
代碼如下:
// GPL80_ESCPOS_USB.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;// SetupDiGetInterfaceDeviceDetail所需要的輸出長度,定義足夠大 #define INTERFACE_DETAIL_SIZE (1024)//設備數(shù)量上限,假設16臺上限 #define MAX_DEVICE 16//USB類的GUID const GUID USB_GUID = { 0xa5dcbf10, 0x6530, 0x11d2, { 0x90, 0x1f, 0x00, 0xc0, 0x4f, 0xb9, 0x51, 0xed } };int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath);//////////////////////////////////////////////////////////////////////////////////////////////////////// //獲取CreateFile的USB端口號 ////////////////////////////////////////////////////////////////////////////////////////////////////////// 根據(jù)GUID獲得設備路徑 // lpGuid: GUID指針 // pszDevicePath: 設備路徑指針的指針,用于返回找到的路徑 // 返回: 成功得到的設備路徑個數(shù),可能不止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;TCHAR* strUSBPrint = TEXT("USB 打印支持");// 取得一個該GUID相關的設備信息集句柄hDevInfoSet = ::SetupDiGetClassDevs(lpGuid, // class GUID NULL, // 無關鍵字 NULL, // 不指定父窗口句柄 DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); // 目前存在的設備// 失敗...if (hDevInfoSet == INVALID_HANDLE_VALUE){printf("failed \r\n");return 0;}// 申請設備接口數(shù)據(jù)空間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 Descriptionif (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"));}_tprintf(_T("buf = %s \r\n"), buf);//是否是要找的設備類型if (_tcscmp(buf, strUSBPrint) != 0)continue;_tprintf(_T("OK\r\n"));ifData.cbSize = sizeof(ifData);// 枚舉符合該GUID的設備接口bResult = ::SetupDiEnumDeviceInterfaces(hDevInfoSet, // 設備信息集句柄NULL, // 不需額外的設備描述lpGuid, // GUID(ULONG)nTotle, // 設備信息集里的設備序號&ifData); // 設備接口信息if (bResult){// 取得該設備接口的細節(jié)(設備路徑)bResult = SetupDiGetInterfaceDeviceDetail(hDevInfoSet, // 設備信息集句柄&ifData, // 設備接口信息pDetail, // 設備接口細節(jié)(設備路徑)INTERFACE_DETAIL_SIZE, // 輸出緩沖區(qū)大小NULL, // 不需計算輸出緩沖區(qū)大小(直接用設定值)NULL); // 不需額外的設備描述if (bResult){// 復制設備路徑到輸出緩沖區(qū)::_tcscpy_s(pszDevicePath[nCount],256, pDetail->DevicePath);// 調整計數(shù)值nCount++;_tprintf(_T("Cnt = %d,pDetail->DevicePath =%s\r\n"), nCount, pDetail->DevicePath);}}}}// 釋放設備接口數(shù)據(jù)空間::GlobalFree(pDetail);// 關閉設備信息集句柄::SetupDiDestroyDeviceInfoList(hDevInfoSet);return nCount; }HANDLE hPort = NULL; //句柄int WriteData(string meg) {DWORD dwWrite;return WriteFile(hPort, meg.c_str(), (DWORD)meg.length(), &dwWrite, NULL); }int _tmain(int argc, _TCHAR* argv[]) {//遍歷USB設備,找到POS打印機路徑int i, nDevice;TCHAR * szDevicePath[MAX_DEVICE]; // 設備路徑// string Port; //串口端口號setlocale(LC_CTYPE, "chs");//設置中文字符TCHAR * Port;// 分配需要的空間for (i = 0; i < MAX_DEVICE; i++){szDevicePath[i] = new TCHAR[256];}// 取設備路徑nDevice = GetDevicePath((LPGUID)&USB_GUID, szDevicePath);i = 0;while (i < nDevice){Port = szDevicePath[i++];_tprintf(_T("device.Port = %s\n"), Port);}hPort = CreateFile(Port, GENERIC_READ | GENERIC_WRITE,0, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);if (hPort == INVALID_HANDLE_VALUE){ // 打開端口失敗return false;}DWORD iBytesLength;char chInitCode[] = "\x0D\x1B\x40";if (!WriteFile(hPort, chInitCode, (DWORD)3L, &iBytesLength, NULL)){_tprintf(_T("Write File Error\r\n"));return 0;}string s;s = "OK打印完成\n\n";WriteData(s);s = "1233333\n\n";WriteData(s);s = "abc\n\n";WriteData(s);s = "cbde\n\n";WriteData(s);s = "\x1D\x56\x41\x00";WriteData(s);getchar();return 0; }輸出:
buf = USB Serial Converter buf = USB 輸入設備 buf = USB 打印支持 OK Cnt = 1,pDetail->DevicePath =\\?\usb#vid_8866&pid_0100#0001b0000000#{a5dcbf10-65 30-11d2-901f-00c04fb951ed} device.Port = \\?\usb#vid_8866&pid_0100#0001b0000000#{a5dcbf10-6530-11d2-901f-00 c04fb951ed}開發(fā)中遇到的問題:
1. win32 的VC 控制臺窗口如何輸出中文 ? setlocale(LC_CTYPE, “chs”);//設置中文字符
2. TCHAR 語句 如何輸出log ? _tprintf(_T(“abc”));
打印效果:
完整的項目工程附件如下,使用的是vs2013 ,修改一下,用其他的版本,應該也可以打開。
https://download.csdn.net/download/wowocpp/10488085
歡迎交流指導
總結
以上是生活随笔為你收集整理的佳博 GP-L80180 USB ESCPOS VC 开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 非线性最小二乘, BA(Bundle A
- 下一篇: [转]航天可靠性设计原则1000条