Test.txt内容:
参考打印到文档功能:
初识打印机驱动
http://www.cnblogs.com/MrDing/p/4078189.html
热敏打印头打印原理和C实现黑白位图的放大
https://www.jianshu.com/p/c754bfa377e4

ascii码 :

十六进制 十进制 字符 含义
0a 10 \n LF
0d 13 \r CR
1b 27 esc
1d 29 gs

热敏打印机参数:

首先佳博GP-L80180I票据打印机技术参数

打印方式 直接热敏式
打印密度 576点/行或512点/行
打印速度 180毫米/秒
接口类型 串口+USB+网口
打印纸宽 79.5±0.5毫米
纸张厚度 0.06~0.08毫米
纸卷外径 83毫米
可靠性 100公里
使用字库 简体中文GB18030大字库
条形码类型 UPC-A/UPC-E/JAN13(EAN13)/JAN8(EAN8)/CODE39/ITF/CODABAR/CODE93/CODE128
字符大小 ANK字符:FontA:12×24点 FontB:9×17点 简体/繁体:24×24点
打印命令 兼容ESC/POS命令

log与流程的对应关系:

对应的代码如下:

// 打印头宽度约为 80mm 的打印函数BOOL USB_GPL801_PrintInStandardMode80(void)
{int ret ;ret = VC_POS_Reset();printf("VC_POS_Reset ret = %d\r\n",ret);VC_POS_FeedLine();VC_POS_FeedLine();//VC_POS_PreDownloadBmpToRAM("a.BMP",3);ret = VC_POS_PreDownloadBmpToRAM("Kitty.bmp",3);printf("VC_POS_PreDownloadBmpToRAM ret = %d\r\n",ret);int nRet = VC_POS_SetMotionUnit(180, 180);if(POS_SUCCESS != nRet){return false;}VC_POS_SetMode(POS_PRINT_MODE_STANDARD);VC_POS_FeedLine();VC_POS_FeedLine();VC_POS_FeedLine();VC_POS_S_TextOut("通行卡ID:", 70, 1, 1, POS_FONT_TYPE_CHINESE,POS_FONT_STYLE_NORMAL);VC_POS_S_TextOut("3303000012345678", 190, 1, 1, POS_FONT_TYPE_CHINESE,POS_FONT_STYLE_NORMAL);     VC_POS_FeedLine();VC_POS_S_TextOut("入口时间:", 70, 1, 1, POS_FONT_TYPE_CHINESE,POS_FONT_STYLE_NORMAL);VC_POS_S_TextOut("2018-04-20  10:10:10", 190, 1, 1, POS_FONT_TYPE_CHINESE,POS_FONT_STYLE_NORMAL);VC_POS_FeedLine();VC_POS_S_TextOut("金额:", 70, 1, 1, POS_FONT_TYPE_CHINESE,POS_FONT_STYLE_NORMAL);    VC_POS_S_TextOut("86.00元", 190, 1, 1, POS_FONT_TYPE_CHINESE,POS_FONT_STYLE_NORMAL);VC_POS_FeedLine();VC_POS_S_TextOut("车牌:", 70, 1, 1, POS_FONT_TYPE_CHINESE,POS_FONT_STYLE_NORMAL);VC_POS_S_TextOut("鲁A66001[蓝色]", 190, 1, 1, POS_FONT_TYPE_CHINESE,POS_FONT_STYLE_NORMAL);   VC_POS_FeedLine();VC_POS_FeedLine();//VC_POS_S_PrintBmpInRAM(3,20,POS_BITMAP_PRINT_NORMAL);VC_POS_S_PrintBmpInRAM(3,20,POS_BITMAP_PRINT_QUADRUPLE);VC_POS_FeedLine();VC_POS_FeedLine();VC_POS_FeedLine();VC_POS_FeedLine();VC_POS_FeedLine();VC_POS_FeedLine();// 切纸VC_POS_CutPaper(POS_CUT_MODE_FULL, 0);return TRUE;}


设置的太小,容易丢数据
log如下:

打印出来的效果如下:

下面开始分析:

1b 40

0a 0a —– 两次换行

1d 23 03
应该是 定义 ID号为03

1d 2a 10 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

x = 0x10
y = 0x06
下面的是位图数据:
101x46像素

这个文件头 54个字节 可能是理解不对

发送的数据 和 bmp 的数据 有点不一致 ,有空分析一下

16 x 6 x 8 = 768个字节
24 x 32 = 768 字节

继续下面的操作:

1d  50 b4 b4 1b  53 0a 0a 0a  1b 24 46 00  1b 4d 03 1d  42 00
1d 62  00
1d 21 00  1b 45 00 1b  7b 00 1b 2d  00
1c 2d 00
1b 56 00
cd  a8 d0 d0 bf  a8 49 44 3a
1b 24 be 00
1b 4d 03
1d  42 00
1d 62  00
1d 21 001b 45 00 1b  7b 00 1b 2d  00 1c 2d 00  1b 56 00 33  33 30 33 30
30 30 30 31  32 33 34 35  36 37 38 0a
1b 24 46 00
1b 4d 03 1d  42 00 1d 62  00 1d 21 00  1b 45 00 1b
7b 00 1b 2d  00 1c 2d 00  1b 56 00
c8  eb bf da ca  b1 bc e4 3a  1b 24 be 00  1b 4d 03 1d  42 00 1d 62
00 1d 21 00  1b 45 00 1b  7b 00 1b 2d  00 1c 2d 00  1b 56 00
32  30 31 38 2d  30 34 2d 32  30 20 20 31
30 3a 31 30  3a 31 30 0a  1b 24 46 00  1b 4d 03 1d  42 00 1d 62  00 1d 21 00  1b 45 00 1b  7b 00 1b 2d
00 1c 2d 00  1b 56 00 bd  f0 b6 ee 3a
1b 24 be 00  1b 4d 03 1d  42 00 1d 62  00 1d 21 00  1b 45 00 1b
7b 00 1b 2d  00 1c 2d 00  1b 56 00 38  36 2e 30 30  d4 aa 0a
1b  24 46 00
1b  4d 03 1d 42  00 1d 62 00
1d 21 00 1b  45 00 1b 7b  00 1b 2d 00  1c 2d 00 1b  56 00 b3 b5  c5 c6 3a
1b  24 be 00
1b  4d 03 1d 42
00 1d 62 00  1d 21 00 1b  45 00 1b 7b  00 1b 2d 00  1c 2d 00
1b  56 00
c2 b3  41 36 36 30  30 31 5b c0
b6 c9 ab 5d     鲁A66001[蓝色]0a 0a 1b 24  14 00 1d 23  03 1d 2f 03  0a 0a 0a 0a  0a 0a 1d 56  00

1d 50 b4 b4

1b 53

1b 24 46 00

0x46 = 70

1b 4d 03 选择中文 字体

1d 42 00

1d 62 00 —- 这个不知道

1d 21 00


1b 45 00

1b 7b 00

1b 2d 00

1c 2d 00

1b 56 00

cd a8 d0 d0 bf a8 49 44 3a
http://www.mytju.com/classcode/tools/encode_gb2312.asp

1b 24 be 00

VC_POS_S_PrintBmpInRAM(3,20,POS_BITMAP_PRINT_QUADRUPLE);1b 24  14 00
1d 23  03   --- 选择ID 03
1d 2f 03  0a 0a 0a 0a  0a 0a 1d 56  00

1d 2f 03

1d 56 00


《佳博热敏票据打印机编程手册.pdf》有二维码指令 (实验没有成功)

page49

直接USB发送ESCPOS指令代码

win32 工程 vs2013
该代码 打印 二维码 没有成功
佳博GP-L80180 热敏打印机

GPL80_ESCPOS_USB.cpp

代码如下:

// 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)//设备数量上限,假设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端口号
////////////////////////////////////////////////////////////////////////////////////////////////////////// 根据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;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;}// 申请设备接口数据空间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){// 取得该设备接口的细节(设备路径)bResult = SetupDiGetInterfaceDeviceDetail(hDevInfoSet,    // 设备信息集句柄&ifData,        // 设备接口信息pDetail,        // 设备接口细节(设备路径)INTERFACE_DETAIL_SIZE,    // 输出缓冲区大小NULL,           // 不需计算输出缓冲区大小(直接用设定值)NULL);          // 不需额外的设备描述if (bResult){// 复制设备路径到输出缓冲区::_tcscpy_s(pszDevicePath[nCount],256, pDetail->DevicePath);// 调整计数值nCount++;_tprintf(_T("Cnt = %d,pDetail->DevicePath =%s\r\n"), nCount, pDetail->DevicePath);}}}}// 释放设备接口数据空间::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 WriteBuf(char *buf, int len)
{DWORD dwWrite;return WriteFile(hPort, buf, len, &dwWrite, NULL);
}int POS_Reset(void)
{string s;s = "\x1B\x40";WriteData(s);return 0;
}int POS_FeedLine(void)
{string s;s = "\x0A";WriteData(s);return 0;}int POS_SetMotionUnit(int x,int y)
{string s;s = "\x1D\x50\xB4\xB4";WriteData(s);s = "\x1B\x53";WriteData(s);return 0;
}int POS_S_TextOut(string &abc)
{string s;char SetAbsPos[4] = {0x1B,0x24,0x46,0x00};WriteBuf(SetAbsPos,4);char SelctFontType[3] = { 0x1B, 0x4D, 0x03 };WriteBuf(SelctFontType, 3);char SelctOutMode[3] = { 0x1D, 0x21, 0x00 };WriteBuf(SelctOutMode, 3);WriteData(abc);return 0;
}int POS_CutPaper()
{char CutPaperMode[4] = { 0x1D, 0x56, 0x41,0x00 };WriteBuf(CutPaperMode, 4);return 0;
}int POS_OutQRCode()
{char  QRCode1[8] = { 0x1d, 0x28 ,0x6b ,0x03, 0x00, 0x31 ,0x43, 0x05 };char  QRCode2[16] = { 0x1d, 0x28, 0x6b, 0x0b, 0x00, 0x31, 0x50, 0x30, 0x47, 0x70, 0x72, 0x69,0x6e, 0x74, 0x65, 0x72 };char  QRCode3[8] = { 0x1d, 0x28, 0x6b, 0x03, 0x00, 0x31, 0x51, 0x30 };WriteBuf(QRCode1, 8);WriteBuf(QRCode2, 16);WriteBuf(QRCode3, 8);return 0;
}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;string s;POS_Reset();POS_FeedLine();POS_FeedLine();POS_SetMotionUnit(180, 180);s = "你好";POS_S_TextOut(s);POS_FeedLine();s = "123abc";POS_S_TextOut(s);POS_FeedLine();s = "666";POS_S_TextOut(s);POS_FeedLine();POS_FeedLine();POS_OutQRCode();//s = "777";//POS_S_TextOut(s);POS_FeedLine();POS_FeedLine();POS_FeedLine();POS_FeedLine();POS_CutPaper();return 0;
}

打印效果:

佳博 热敏打印机 ESCPOS 指令研究相关推荐

  1. JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码

    JAVA 佳博热敏打印机利用TSCLIB.dll动态链接库打印物料条码 准备 1.TSCLIB.dll (下载版本与jdk版本一致,32位/64位) 2.佳博热敏打印机一台(或其他tsc系列打印机) ...

  2. Android集成佳博热敏打印机打印小票功能

    一.说明 最近公司项目需要做打印机打印小票功能,首先公司买了一个佳博小票打印机作为测试用机.然后在开发的过程中也遇到一些坑,在此记录一下. 二.集成过程 1. 下载开发文档 首先需要去其官网下载SDK ...

  3. Android集成佳博热敏打印机打印小票对齐问题

    一.说明 比如:商品名.单价.数量.金额,它们的排列需要像表格一样对齐. 二.实现 主要用到的API: // 设置单位距离 esc.addSetHorAndVerMotionUnits((byte) ...

  4. Android集成佳博热敏打印机打印小票商品名称换行问题

    一.说明 在打印小票的时候,商品名称一行显示不下需要折行打印,但是这个折行又不是放在末尾,到头后再折回来接着打印,该怎么办呢 ? 二.思路 大体的思路就是将商品名称切割成最大不超过一定长度的若干个字符 ...

  5. 关于佳博热敏打印机添加打印机3019错误

    http://smarnet.cc/cn/download.aspx?current=down 在这个网页下载全系列产品驱动 即可解决问题! http://download.csdn.net/deta ...

  6. 佳博热敏打印机 GP-L80180I 使用

    串口:

  7. 佳博 TSC打印机 TSPL指令开发

    如何在电脑上使用C# 调用佳博 TSC打印机指令控制打印 踩了不少坑 跟大家分享下开发需要注意的地方 1. 佳博和TSC的 BARCODE 指令有出入,TSC多了一个参数,直接用佳博的打印是扫码不出二 ...

  8. 佳博 GP-L80180 USB ESCPOS VC 开发

    手头有一个佳博 GP-L80180 热敏打印机,该打印机有USB口 ,串口. 给的例子,串口通了,通过USB口,安装驱动之后,也可以打印测试页. 但是用VC程序 通过系统驱动打印的方式 ,不是很熟悉. ...

  9. C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)

     C#版OPOS打印 基于北洋OPOS SDK二次开发包,支持EPSON和北洋.佳博.商祺等支持标准ESC/POS指令的POS打印机 支持并口,串口,网口,USB口,驱动方式等多种端口 支持开关钱箱 ...

最新文章

  1. 如何在超大分辨率的图片中检测目标?
  2. 代码的世界中,一个逻辑套着另外一个逻辑,如何让每一种逻辑在代码中都有迹可循?...
  3. 安装你自己的perl modules
  4. 2015c语言9月答案,2015年9月计算机二级C语言预测题答案
  5. golang中的匿名组合
  6. 今日七夕!不取标题,只想娶你
  7. QEMU CVE-2020-14364 漏洞分析(含 PoC 演示)
  8. HDU 1010 深搜+奇偶剪枝
  9. 在SharePoint Server 2007中创建定制的用户管理模块
  10. 蓝桥杯-明码 bitset初识
  11. Objective-C 函数
  12. 3d打印切片软件 linux,玩好3D打印机 从19款3D切片软件开始
  13. 排名 教材 数字电子技术_数字电子技术教材改革及实践
  14. 技术总结--android篇(四)--工具类总结
  15. 手机风波(二)の惊喜篇
  16. php 编码转换 乱码解决
  17. python实战: 短链接生成器
  18. 怎么快速学习Python
  19. GrowingIO 数据采集 iOS SDK 测试实践
  20. Java实现伪造邮件发信人

热门文章

  1. 剖析中国软件百强收藏
  2. 30 分钟未付款取消订单,怎么做?
  3. matlab超出所有矩阵维度,matlab中索引超出矩阵维度
  4. 四川山海蓝图:如何在抖音上吸引更多用户
  5. WEB>SSRF(URL Bypass,数字IP Bypass,302跳转Bypass,DNS重绑定Bypass)
  6. Lab图,RGB图,灰度图,二值图的联系
  7. android 中报Merging Errors
  8. 程序员,请对自己好一点
  9. 【Spring Cloud】【尚硅谷】学习笔记
  10. 数字信号处理课程设计——调制与解调