使用热敏打印机打印条码 Android
Print barcode using thermal printer Android
我能够打印文本,但是当涉及到条形码时,它不显示或只显示不规则文本。
这是我的源代码
//barcode 128
byte[] formats = {(byte) 0x1d, (byte) 0x6b, (byte) 0x73,(byte) 0x0d};
byte[] contents = content.getBytes();
byte[] bytes = new byte[formats.length + contents.length];
System.arraycopy(formats, 0, bytes, 0, formats.length );
System.arraycopy(contents, 0, bytes, formats.length, contents.length);
usbCtrl.sendByte(bytes, dev);
usbCtrl.sendByte(LineFeed(), dev);
结果条码没有显示,我是不是漏了什么
请帮帮我
编辑
我找到了 ESC/POS 代码:
GS k m d1...dk NUL or GS k m n d1...d k
但是当我尝试这个的时候,还是得到了同样的结果
GS k
POS 代码有两个版本(正如您已经发现的那样):
GS k - print one dimensional barcode
m - barcode mode selector
[d]k - data bytes
NUL - terminator
此版本仅适用于纯 ASCII 数据,因为它使用 0x00
(NUL) 作为终止符。
GS k - print one dimensional barcode
m - barcode mode selector
n - content length in bytes
[d]k - data bytes
此版本使用额外的长度字节n
来指示数据部分(它也仅适用于某些编码,包括CODE128
)。
您的代码在命令字节中有一个杂散的 0x0d
,也可能使用了错误的格式。
如果您打算打印纯 ASCII 数据格式,则命令如下:
byte[] formats = {(byte) 0x1d, (byte) 0x6b, (byte) 0x49};
byte[] contents = content.getBytes();
byte[] bytes = new byte[formats.length + contents.length + 1];
System.arraycopy(formats, 0, bytes, 0, formats.length );
System.arraycopy(contents, 0, bytes, formats.length, contents.length);
// add a terminating NULL
bytes[formats.length + contents.length] = (byte) 0x00;
或更安全的版本,因为它也具有预期的数据长度:
byte[] contents = content.getBytes();
// include the content length after the mode selector (0x49)
byte[] formats = {(byte) 0x1d, (byte) 0x6b, (byte) 0x49, (byte)content.length};
byte[] bytes = new byte[formats.length + contents.length];
System.arraycopy(formats, 0, bytes, 0, formats.length );
System.arraycopy(contents, 0, bytes, formats.length, contents.length);
如果 两者都不工作,那么您的打印机可能根本不支持 CODE128
。
5890 是一个足够常见的规格,市场上有很多便宜的 "drop-in" 替代品,它们省去了更复杂的条码实现,只包括简单的编码,如 EAN8
、[=21] =]等
我能够打印文本,但是当涉及到条形码时,它不显示或只显示不规则文本。
这是我的源代码
//barcode 128
byte[] formats = {(byte) 0x1d, (byte) 0x6b, (byte) 0x73,(byte) 0x0d};
byte[] contents = content.getBytes();
byte[] bytes = new byte[formats.length + contents.length];
System.arraycopy(formats, 0, bytes, 0, formats.length );
System.arraycopy(contents, 0, bytes, formats.length, contents.length);
usbCtrl.sendByte(bytes, dev);
usbCtrl.sendByte(LineFeed(), dev);
结果条码没有显示,我是不是漏了什么
请帮帮我
编辑
我找到了 ESC/POS 代码:
GS k m d1...dk NUL or GS k m n d1...d k
但是当我尝试这个的时候,还是得到了同样的结果
GS k
POS 代码有两个版本(正如您已经发现的那样):
GS k - print one dimensional barcode
m - barcode mode selector
[d]k - data bytes
NUL - terminator
此版本仅适用于纯 ASCII 数据,因为它使用 0x00
(NUL) 作为终止符。
GS k - print one dimensional barcode
m - barcode mode selector
n - content length in bytes
[d]k - data bytes
此版本使用额外的长度字节n
来指示数据部分(它也仅适用于某些编码,包括CODE128
)。
您的代码在命令字节中有一个杂散的 0x0d
,也可能使用了错误的格式。
如果您打算打印纯 ASCII 数据格式,则命令如下:
byte[] formats = {(byte) 0x1d, (byte) 0x6b, (byte) 0x49};
byte[] contents = content.getBytes();
byte[] bytes = new byte[formats.length + contents.length + 1];
System.arraycopy(formats, 0, bytes, 0, formats.length );
System.arraycopy(contents, 0, bytes, formats.length, contents.length);
// add a terminating NULL
bytes[formats.length + contents.length] = (byte) 0x00;
或更安全的版本,因为它也具有预期的数据长度:
byte[] contents = content.getBytes();
// include the content length after the mode selector (0x49)
byte[] formats = {(byte) 0x1d, (byte) 0x6b, (byte) 0x49, (byte)content.length};
byte[] bytes = new byte[formats.length + contents.length];
System.arraycopy(formats, 0, bytes, 0, formats.length );
System.arraycopy(contents, 0, bytes, formats.length, contents.length);
如果 两者都不工作,那么您的打印机可能根本不支持 CODE128
。
5890 是一个足够常见的规格,市场上有很多便宜的 "drop-in" 替代品,它们省去了更复杂的条码实现,只包括简单的编码,如 EAN8
、[=21] =]等