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 ArrayUnsigned Integer typecode总是 return 两位小数 [153, 255].

如果我使用 python 的 hex 方法,则十六进制值将是 [0x99, 0xff] ,但是如何将十六进制值中的每个位或数字解释为 0 或 1 值?
如果我将 returned 整数转换为二进制,我会得到 f'{255:b}' returns '11111111'f'{153:b}' returns '10011001' 当我打开盖子并发送打印机状态命令时并没有说太多,它给了我完全相同的结果。

编辑:
所以我想也许我使用了错误的 java 方法来读取 InputStream,因为我使用 InputStreamReaderBufferedReader 这可能会 return 错误的结果。我尝试仅使用 getInputStream 并得到与上面完全相同的结果

编辑 2:
我将编码从 latin-1 更改为 utf-8 得到了完全不同的结果,即整数65533hex(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)

输入数据被处理为以字节为单位的二进制数据,而不是字符。
状态数据需要一点一点地处理,就像你最后一句话一样。