ESC/POS 打印机状态只返回意外的两个无符号整数
ESC/POS Printer status only returning unexpected two unsigned integers
我有一个使用 ESC/POS 命令语言打印条形码的 kivy 应用程序。我注意到的是,如果我没有获得打印机状态,应用程序将盲目发送命令,而不关心打印机是否缺纸或电池没电等。所以我按照制造商的规定使用 GS 0x99
命令来读取打印机状态,但我不确定我是否正确理解了结果。根据手册应该是 return 1 D 99 XX FF
其中前五位代表
位 0
,值为 0 或 1 表示纸张状态;
Bit 1
值为 0 或 1 表示盖是否关闭;
Bit 2
值为 0 或 1 表示打印机温度;
Bit 3
电池状态值为 0 或 1;和
位 4
,打印状态值为 0 或 1。
我将 InputStream 读入 python Array
和 Unsigned Integer typecode
总是 return 两位小数 [153, 255]
.
如果我使用 python 的 hex
方法,则十六进制值将是 [0x99, 0xff]
,但是如何将十六进制值中的每个位或数字解释为 0 或 1 值?
如果我将 returned 整数转换为二进制,我会得到 f'{255:b}' returns '11111111'
和 f'{153:b}' returns '10011001'
当我打开盖子并发送打印机状态命令时并没有说太多,它给了我完全相同的结果。
编辑:
所以我想也许我使用了错误的 java 方法来读取 InputStream,因为我使用 InputStreamReader
和 BufferedReader
这可能会 return 错误的结果。我尝试仅使用 getInputStream
并得到与上面完全相同的结果
编辑 2:
我将编码从 latin-1
更改为 utf-8
得到了完全不同的结果,即整数65533
; hex(65533) is 0xfffd
打印机详细信息:
制造商:Urovo
型号:K319
PN:48389221
Link to command
有人能给我指出正确的方向来解释阅读的结果吗?我应该使用按位运算符来评估每个位吗?
例如,有以下几种可能。
- 这不是硬件通知的模式设置。
- 由于使用了 InputStream,因此隐藏了实际的通知数据。
通知的数据是二进制数据,以字节为单位。
您需要将其视为一个字节数据序列。
如果假设某些字符设置了编码,则可能会发生意外转换和错误通知。
根据文档,状态通知是后面4个字节的数据,第三个字节是有效数据。
0x1D, 0x99, 0xXX, 0xFF
例如,如果[0x99, 0xff]
您认为您先收到,那么第一个0x1D
和状态数据中的字节信息将丢失。
而如果第二个得到的0xfffd
是最后2个字节,状态好像是0xfd
,以bit为单位判断时如下,很难想将其作为实际状态值。
1 : Out of paper
0 : Cover (closed)
1 : Printer core overheating
1 : battery is low
1 : Print status (Probably during printing)
111 : =7 '/' (Probably undefined or unsupported paper bin number)
因此,数据似乎是通过从latin-1
转换为utf-8
而更改的。
有这样一篇文章。
Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)
输入数据被处理为以字节为单位的二进制数据,而不是字符。
状态数据需要一点一点地处理,就像你最后一句话一样。
我有一个使用 ESC/POS 命令语言打印条形码的 kivy 应用程序。我注意到的是,如果我没有获得打印机状态,应用程序将盲目发送命令,而不关心打印机是否缺纸或电池没电等。所以我按照制造商的规定使用 GS 0x99
命令来读取打印机状态,但我不确定我是否正确理解了结果。根据手册应该是 return 1 D 99 XX FF
其中前五位代表
位 0
,值为 0 或 1 表示纸张状态;
Bit 1
值为 0 或 1 表示盖是否关闭;
Bit 2
值为 0 或 1 表示打印机温度;
Bit 3
电池状态值为 0 或 1;和
位 4
,打印状态值为 0 或 1。
我将 InputStream 读入 python Array
和 Unsigned Integer typecode
总是 return 两位小数 [153, 255]
.
如果我使用 python 的 hex
方法,则十六进制值将是 [0x99, 0xff]
,但是如何将十六进制值中的每个位或数字解释为 0 或 1 值?
如果我将 returned 整数转换为二进制,我会得到 f'{255:b}' returns '11111111'
和 f'{153:b}' returns '10011001'
当我打开盖子并发送打印机状态命令时并没有说太多,它给了我完全相同的结果。
编辑:
所以我想也许我使用了错误的 java 方法来读取 InputStream,因为我使用 InputStreamReader
和 BufferedReader
这可能会 return 错误的结果。我尝试仅使用 getInputStream
并得到与上面完全相同的结果
编辑 2:
我将编码从 latin-1
更改为 utf-8
得到了完全不同的结果,即整数65533
; hex(65533) is 0xfffd
打印机详细信息:
制造商:Urovo
型号:K319
PN:48389221
Link to command
有人能给我指出正确的方向来解释阅读的结果吗?我应该使用按位运算符来评估每个位吗?
例如,有以下几种可能。
- 这不是硬件通知的模式设置。
- 由于使用了 InputStream,因此隐藏了实际的通知数据。
通知的数据是二进制数据,以字节为单位。
您需要将其视为一个字节数据序列。
如果假设某些字符设置了编码,则可能会发生意外转换和错误通知。
根据文档,状态通知是后面4个字节的数据,第三个字节是有效数据。
0x1D, 0x99, 0xXX, 0xFF
例如,如果[0x99, 0xff]
您认为您先收到,那么第一个0x1D
和状态数据中的字节信息将丢失。
而如果第二个得到的0xfffd
是最后2个字节,状态好像是0xfd
,以bit为单位判断时如下,很难想将其作为实际状态值。
1 : Out of paper
0 : Cover (closed)
1 : Printer core overheating
1 : battery is low
1 : Print status (Probably during printing)
111 : =7 '/' (Probably undefined or unsupported paper bin number)
因此,数据似乎是通过从latin-1
转换为utf-8
而更改的。
有这样一篇文章。
Unicode Character 'REPLACEMENT CHARACTER' (U+FFFD)
输入数据被处理为以字节为单位的二进制数据,而不是字符。
状态数据需要一点一点地处理,就像你最后一句话一样。