【问题标题】:interpreting individual bits from ESC/POS status code解释 ESC/POS 状态码中的各个位
【发布时间】:2019-03-13 09:01:25
【问题描述】:

我承认,我正在做的这个项目并不完全是关于如何使用 Python 迈出第一步的教科书示例,但我在这里。

设置

一台 ESC/POS 打印机,与 RaspberryPi 本地连接(以太网、套接字),远程接收打印作业(通过 AMQP)。

问题

连接到 AMQP 代理和打印机以及打印工作正常。我正在努力解决的问题是使用 ctypes 处理打印机状态代码。

在浏览 Internet 并寻找最佳方法时,我发现了一篇 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    )
               ]

我如何为相应的类分配正确的值?

附言 所有 4 个状态码总是正好 1 个字节长

p.p.s 我并不热衷于使用 ctypes,如果在这种情况下它不是一种有效的方法,我会很好,我将遍历所有 4 个响应并将这些值分配给 0/1 数组,但是我的好奇心越来越好,我想知道这种方式是否可行

【问题讨论】:

    标签: python sockets raw-data escpos


    【解决方案1】:

    方式把事情复杂化了。

    flags    = ord(data)
    drawer   = (flags & 4) != 0
    offline  = (flags & 8) != 0
    recovery = (flags & 32) != 0
    feed     = (flags & 64) != 0
    

    【讨论】:

    • 哇,这是一段干净而简短的代码 :) 我想我确实有这种过度思考的缺陷。谢谢@Mark Ransom
    猜你喜欢
    • 2019-10-27
    • 2014-09-12
    • 2018-08-17
    • 2014-08-25
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 2018-12-18
    • 2020-09-22
    相关资源
    最近更新 更多