如何将二维码(或位图)打印到热敏打印机?
How to print QR code (or bitmap) to thermal printer?
我正在使用在 linux/windows 和 android 上运行的软件。
在 linux 和 windows 上,它通过生成位图并通过 ESC * 发送到串行热敏打印机来打印 QR 码。
在 android 上它使用蓝牙,但对于特定设备(带有 android 4.4 的平板电脑)打印机实际上是串行的。因此,它应该与 linux 或 windows.
上的工作方式相同
只是它没有,它打印出这个乱七八糟的东西:
打印机自检打印二维码,所以我假设它支持二维码。我不知道是哪个 make/model,搜索“80-IV-UR Thermal Printer”的结果不多。
所以我继续尝试实施 GS ( k
。这是我所在的位置:
GS ( k 165: 0x1D 0x28 0x6B 0x04 0x00 0x31 0x41 0x32 0x00
(n1 0x31, 模型 1)
GS ( k 167: 0x1D 0x28 0x6B 0x03 0x00 0x31 0x43 0x08
(n 0x08)
GS ( k 169: 0x1D 0x28 0x6B 0x03 0x00 0x31 0x45 0x31
(n 0x31, ECC M)
GS ( k 180: 0x1D 0x28 0x6B 0x0E 0x00 0x31 0x50 0x30 0x69 0x20 0x61 0x6D 0x20 0x61 0x20 0x74 0x65 0x73 0x74
(pL 14 pH 0 "我是一个测试")
GS ( k 181: 0x1D 0x28 0x6B 0x03 0x00 0x31 0x51 0x30
(m 0x30)
GS ( k 182: 0x1D 0x28 0x6B 0x03 0x00 0x31 0x52 0x30
(m 0x30)
然而,当打印机到达收据的这一部分时,它就停止了。
打印 1:打印 QR
之前的所有内容
print 2: 什么都不打印
打印 3:打印 QR
之前的所有内容
print 4: 什么都不打印
...
是我用错了这些命令还是其他地方出了问题?
GS ( k 182 (transmit size) 是可选的吗?
这些 ESC/POS 命令是否得到广泛支持?从什么时候开始?
GS的数据部分(bytes/hexadecimal中的k 180还是应该是ASCII?
事实证明,我的 ESC/POS 代码没有任何问题。找了一圈,找到软件打印的点,运行自己测试,发到串口,生成二维码。
这是我用来参考的:
uint8_t myEscTst[] = { 0x1B, 0x40, 0x1B, 0x21, 0x00, 'H', 'e', 'l', 'l', 'o', ',', ' ', 't', 'h', 'e', 'r', 'm', 'a', 'l', ' ', 'w', 'o', 'r', 'l', 'd', '!', 0x1B, 0x64, 0x03 };
write(serialFD, myEscTst, sizeof(myEscTst));
uint8_t qrEsc165[] = { 0x1D, 0x28, 0x6B, 0x04, 0x00, 0x31, 0x41, 0x32, 0x00 };
write(serialFD, qrEsc165, sizeof(qrEsc165));
uint8_t qrEsc167[] = { 0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x43, 0x08 };
write(serialFD, qrEsc167, sizeof(qrEsc167));
uint8_t qrEsc169[] = { 0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x45, 0x31 };
write(serialFD, qrEsc169, sizeof(qrEsc169));
uint8_t qrEsc180[] = { 0x1D, 0x28, 0x6B, 0x0E, 0x00, 0x31, 0x50, 0x30, 'i', ' ', 'a', 'm', ' ', 'a', ' ', 't', 'e', 's', 't' };
write(serialFD, qrEsc180, sizeof(qrEsc180));
uint8_t qrEsc181[] = { 0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x51, 0x30 };
write(serialFD, qrEsc181, sizeof(qrEsc181));
uint8_t qrEsc182[] = { 0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x52, 0x30 };
write(serialFD, qrEsc182, sizeof(qrEsc182));
uint8_t qrEscLn3[] = { 0x1B, 0x64, 0x03 };
write(serialFD, qrEscLn3, sizeof(qrEscLn3));
我正在使用在 linux/windows 和 android 上运行的软件。
在 linux 和 windows 上,它通过生成位图并通过 ESC * 发送到串行热敏打印机来打印 QR 码。
在 android 上它使用蓝牙,但对于特定设备(带有 android 4.4 的平板电脑)打印机实际上是串行的。因此,它应该与 linux 或 windows.
只是它没有,它打印出这个乱七八糟的东西:
打印机自检打印二维码,所以我假设它支持二维码。我不知道是哪个 make/model,搜索“80-IV-UR Thermal Printer”的结果不多。
所以我继续尝试实施 GS ( k
。这是我所在的位置:
GS ( k 165: 0x1D 0x28 0x6B 0x04 0x00 0x31 0x41 0x32 0x00
(n1 0x31, 模型 1)
GS ( k 167: 0x1D 0x28 0x6B 0x03 0x00 0x31 0x43 0x08
(n 0x08)
GS ( k 169: 0x1D 0x28 0x6B 0x03 0x00 0x31 0x45 0x31
(n 0x31, ECC M)
GS ( k 180: 0x1D 0x28 0x6B 0x0E 0x00 0x31 0x50 0x30 0x69 0x20 0x61 0x6D 0x20 0x61 0x20 0x74 0x65 0x73 0x74
(pL 14 pH 0 "我是一个测试")
GS ( k 181: 0x1D 0x28 0x6B 0x03 0x00 0x31 0x51 0x30
(m 0x30)
GS ( k 182: 0x1D 0x28 0x6B 0x03 0x00 0x31 0x52 0x30
(m 0x30)
然而,当打印机到达收据的这一部分时,它就停止了。
打印 1:打印 QR
之前的所有内容
print 2: 什么都不打印
打印 3:打印 QR
之前的所有内容
print 4: 什么都不打印
...
是我用错了这些命令还是其他地方出了问题?
GS ( k 182 (transmit size) 是可选的吗?
这些 ESC/POS 命令是否得到广泛支持?从什么时候开始?
GS的数据部分(bytes/hexadecimal中的k 180还是应该是ASCII?
事实证明,我的 ESC/POS 代码没有任何问题。找了一圈,找到软件打印的点,运行自己测试,发到串口,生成二维码。
这是我用来参考的:
uint8_t myEscTst[] = { 0x1B, 0x40, 0x1B, 0x21, 0x00, 'H', 'e', 'l', 'l', 'o', ',', ' ', 't', 'h', 'e', 'r', 'm', 'a', 'l', ' ', 'w', 'o', 'r', 'l', 'd', '!', 0x1B, 0x64, 0x03 };
write(serialFD, myEscTst, sizeof(myEscTst));
uint8_t qrEsc165[] = { 0x1D, 0x28, 0x6B, 0x04, 0x00, 0x31, 0x41, 0x32, 0x00 };
write(serialFD, qrEsc165, sizeof(qrEsc165));
uint8_t qrEsc167[] = { 0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x43, 0x08 };
write(serialFD, qrEsc167, sizeof(qrEsc167));
uint8_t qrEsc169[] = { 0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x45, 0x31 };
write(serialFD, qrEsc169, sizeof(qrEsc169));
uint8_t qrEsc180[] = { 0x1D, 0x28, 0x6B, 0x0E, 0x00, 0x31, 0x50, 0x30, 'i', ' ', 'a', 'm', ' ', 'a', ' ', 't', 'e', 's', 't' };
write(serialFD, qrEsc180, sizeof(qrEsc180));
uint8_t qrEsc181[] = { 0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x51, 0x30 };
write(serialFD, qrEsc181, sizeof(qrEsc181));
uint8_t qrEsc182[] = { 0x1D, 0x28, 0x6B, 0x03, 0x00, 0x31, 0x52, 0x30 };
write(serialFD, qrEsc182, sizeof(qrEsc182));
uint8_t qrEscLn3[] = { 0x1B, 0x64, 0x03 };
write(serialFD, qrEscLn3, sizeof(qrEscLn3));