解释 ESC/POS 状态代码中的各个位
interpreting individual bits from ESC/POS status code
我承认,我正在从事的这个项目并不是关于如何使用 Python 迈出第一步的教科书示例,但我做到了。
设置
一台 ESC/POS 打印机,与 RaspberryPi 本地连接(以太网、套接字),正在远程接收打印作业(通过 AMQP)。
问题
连接到 AMQP 代理和打印机以及打印工作正常。我正在努力解决的问题是使用 ctypes 处理打印机状态代码。
在网上搜索最佳方法时,我发现了一篇 Python wiki 文章 (link) 关于位操作,其中指出对于像我这样的用法,推荐使用 ctypes .这确实看起来很棒而且干净的方法,所以我立即将其应用到我的代码中(下面是它的简化版本)。
import socket
import ctypes
class PrinterStatus_bits( ctypes.LittleEndianStructure ):
_fields_ = [
("fix0", c_uint8, 1 ), # asByte & 1
("fix1", c_uint8, 1 ), # asByte & 2
("drawer", c_uint8, 1 ), # asByte & 4
("offline", c_uint8, 1 ), # asByte & 8
("fix4", c_uint8, 1 ), # asByte & 16
("recovery", c_uint8, 1 ), # asByte & 32
("feed", c_uint8, 1 ), # asByte & 64
("fix7", c_uint8, 1 ), # asByte & 128
]
class Flags( ctypes.Union ):
_anonymous_ = ("bit",)
_fields_ = [
("bit", PrinterStatus_bits),
("asByte", c_uint8 )
]
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('123.123.123.123', 9100)
c_uint8 = ctypes.c_uint8
flags = Flags()
msg = b'\x10\x04\x01'
print('connecting to %s port %s' % server_address)
sock.connect(server_address)
print('requesting printer status')
sock.sendall(msg)
data = sock.recv(1)
flags.asByte = ord(data)
1个字节的接收长度是有意识设置的,因为这是响应的固定长度。然而,问题是这只是第一个(四个)一般状态代码。
我很想通过 flags
对象获得所有这些状态代码,只是不知道如何使用联合。
如果我这样做:
class PrinterStatus_bits( ctypes.LittleEndianStructure ):
class PrinterOffline_bits( ctypes.LittleEndianStructure ):
class PrinterError_bits( ctypes.LittleEndianStructure ):
class PrinterPaper_bits( ctypes.LittleEndianStructure ):
class Flags( ctypes.Union ):
_anonymous_ = ("status",)
_fields_ = [
("status", PrinterStatus_bits),
("offline", PrinterOffline_bits),
("error", PrinterError_bits),
("paper", PrinterPaper_bits ),
("asByte", c_uint8 )
]
如何为相应的 类 分配正确的值?
p.s。
所有 4 个状态代码始终正好是 1 个字节长
p.p.s
我并不是一心想使用 ctypes,如果在这种情况下这不是一种有效的方法,我会接受的,我将循环遍历所有 4 个响应并将这些值分配给 0/1 数组,但是我的好奇心变得更好了,我想看看这种方式是否可行
你方式把这个复杂化了。
flags = ord(data)
drawer = (flags & 4) != 0
offline = (flags & 8) != 0
recovery = (flags & 32) != 0
feed = (flags & 64) != 0
我承认,我正在从事的这个项目并不是关于如何使用 Python 迈出第一步的教科书示例,但我做到了。
设置
一台 ESC/POS 打印机,与 RaspberryPi 本地连接(以太网、套接字),正在远程接收打印作业(通过 AMQP)。
问题
连接到 AMQP 代理和打印机以及打印工作正常。我正在努力解决的问题是使用 ctypes 处理打印机状态代码。
在网上搜索最佳方法时,我发现了一篇 Python wiki 文章 (link) 关于位操作,其中指出对于像我这样的用法,推荐使用 ctypes .这确实看起来很棒而且干净的方法,所以我立即将其应用到我的代码中(下面是它的简化版本)。
import socket
import ctypes
class PrinterStatus_bits( ctypes.LittleEndianStructure ):
_fields_ = [
("fix0", c_uint8, 1 ), # asByte & 1
("fix1", c_uint8, 1 ), # asByte & 2
("drawer", c_uint8, 1 ), # asByte & 4
("offline", c_uint8, 1 ), # asByte & 8
("fix4", c_uint8, 1 ), # asByte & 16
("recovery", c_uint8, 1 ), # asByte & 32
("feed", c_uint8, 1 ), # asByte & 64
("fix7", c_uint8, 1 ), # asByte & 128
]
class Flags( ctypes.Union ):
_anonymous_ = ("bit",)
_fields_ = [
("bit", PrinterStatus_bits),
("asByte", c_uint8 )
]
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('123.123.123.123', 9100)
c_uint8 = ctypes.c_uint8
flags = Flags()
msg = b'\x10\x04\x01'
print('connecting to %s port %s' % server_address)
sock.connect(server_address)
print('requesting printer status')
sock.sendall(msg)
data = sock.recv(1)
flags.asByte = ord(data)
1个字节的接收长度是有意识设置的,因为这是响应的固定长度。然而,问题是这只是第一个(四个)一般状态代码。
我很想通过 flags
对象获得所有这些状态代码,只是不知道如何使用联合。
如果我这样做:
class PrinterStatus_bits( ctypes.LittleEndianStructure ):
class PrinterOffline_bits( ctypes.LittleEndianStructure ):
class PrinterError_bits( ctypes.LittleEndianStructure ):
class PrinterPaper_bits( ctypes.LittleEndianStructure ):
class Flags( ctypes.Union ):
_anonymous_ = ("status",)
_fields_ = [
("status", PrinterStatus_bits),
("offline", PrinterOffline_bits),
("error", PrinterError_bits),
("paper", PrinterPaper_bits ),
("asByte", c_uint8 )
]
如何为相应的 类 分配正确的值?
p.s。 所有 4 个状态代码始终正好是 1 个字节长
p.p.s 我并不是一心想使用 ctypes,如果在这种情况下这不是一种有效的方法,我会接受的,我将循环遍历所有 4 个响应并将这些值分配给 0/1 数组,但是我的好奇心变得更好了,我想看看这种方式是否可行
你方式把这个复杂化了。
flags = ord(data)
drawer = (flags & 4) != 0
offline = (flags & 8) != 0
recovery = (flags & 32) != 0
feed = (flags & 64) != 0