PyUsb - Ler dados impressora Térmica via Usb ESC/POS

270 views
Skip to first unread message

Douglas C. Rodrigues

unread,
Oct 22, 2021, 9:59:26 PM10/22/21
to Python Brasil

Pessoal, tudo bem?

Preciso ler os dados dos sensores de uma determinada impressora térmica, em especifico a PRT MPT725, em fim, ela utiliza comandos ESCPOS para sua comunicação, então a resposta não precisa ser baseada apenas nesse modelo e marca.

Eu atualmente consigo mandar comandos ESCPOS para a mesma, como acionar a guilhotina, aumentar e diminuir tamanho das fontes e etc... tudo isso pela biblioteca Pyusb.

Porém, não consigo ler o que a impressora me envia na porta usb com a biblioteca pyusb. A intenção era monitorar os sensores de falta de papel, papel enroscado entre outros, espero receber esses dados na usb após enviar o comando escpos correspondente.

Esse é meu código:

import usb.core 

import usb.util 


def main(): 

    device = usb.core.find(idVendor=0x20d1, idProduct=0x7008)


    # Utilizo a primeira configuração 

    device.set_configuration()


    # Primeiro endpoint 

     endpoint = device[0][(0,0)][0] 

     # le o pacote de dados

     data = None 

     try: 

         data = device.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize) 

         sret = ''.join([chr(x) for x in data]) 

         print('resp',sret.decode('utf-8')) 

    except usb.core.USBError as e: 

        data = None 

        if e.args == ('Operation timed out',): 

            pass 

if __name__ == '__main__': 

    main()

#Retorna isso >>>> 

' ' '                         ('resp',u'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x               00\x00\x00\x00\x00\x00\x00\x00\x0') ''' 

' ' '    

Retorna isso >> é o que recebo da impressora, não consigo interpretar isso com inteiros mesmo tentando converter.

 

Se alguém por favor conseguir colocar um exemplo, ficarei muito agradecido

Markos

unread,
Oct 23, 2021, 5:59:34 PM10/23/21
to python...@googlegroups.com

Oi Douglas,

Ainda não tive experiência de comunicação serial usando o Python.

Mas uma dica que talvez possa ajudar.

Você já verificou se precisa configurar os parâmetro de comunicação?

Ex: bits de dados, paridade, bit de parada e a velocidade de comunicação.

Aqui algumas dicas:

www.c2o.pro.br/automacao/ar01s11.html

Bom trabalho,
Markos
--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/e110e96e-d982-48dd-b69d-a4c9bdc2ffcan%40googlegroups.com.

Douglas C. Rodrigues

unread,
Oct 23, 2021, 9:04:06 PM10/23/21
to python...@googlegroups.com
Markos,

Obrigado pela sua atenção e tempo em me ajudar a solucionar esse problema. 

Fico muito agradecido.

Infelizmente eu não estou utilizando a porta serial e sim a usb direta. Consigo enviar dados de impressão, acionar a guilhotina entre outros comandos escpos mais a leitura é que está me fazendo cair os cabelos kkk

Obs: achei o link que tu passou mega interessante.

Você recebeu essa mensagem porque está inscrito em um tema no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse tema, acesse https://groups.google.com/d/topic/python-brasil/lJpUy0oLHKI/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus temas, envie um e-mail para python-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/4700a9db-3984-350a-4dc7-8371ea015c94%40c2o.pro.br.

Edson Garrido

unread,
Oct 29, 2021, 7:33:19 AM10/29/21
to python...@googlegroups.com
Bom dia, Douglas,

Já experimentou a lib python-escpos? https://python-escpos.readthedocs.io/en/latest/

Talvez os parâmetros retornados pelo método query_status ajudem.

Estou trabalhando em um projeto onde eventualmente terei que fazer algo semelhante, por isso deixei os pontos críticos da entrega mapeados para me aprofundar neles na medida em que o desenvolvimento evolui. 

Boa sorte,



Edson Garrido


--

Marco Otavio

unread,
Nov 9, 2022, 4:30:04 PM11/9/22
to Python Brasil
Conseguiu resolver ? 

Estou conseguindo o retorno, mas o retorno não bate com o manual.
import usb.core
import usb.util

cmd_LineFeed        = [0x0A]
cmd_PaperCutTOTAL   = [0x1d, 0x56, 0x01]
cmd_Status          = [0x10, 0x04, 0x04]

m_Device = usb.core.find(idVendor=0x20d1, idProduct=0x7008)

if(m_Device == None):
    print("device não encontrado")

m_Device.set_configuration()
m_Device.set_configuration()

# get an endpoint instance
cfg = m_Device.get_active_configuration()
intf = cfg[(0,0)]

ep = usb.util.find_descriptor(
    intf,
    # match the first OUT endpoint
    custom_match = \
    lambda e: \
        usb.util.endpoint_direction(e.bEndpointAddress) == \
        usb.util.ENDPOINT_OUT)

assert ep is not None

# ep.write('test')
# for x in range(0,20):
#     ep.write(cmd_LineFeed)
# ep.write(cmd_PaperCutTOTAL)

ep.write(cmd_Status)
ret = m_Device.read(ep.bEndpointAddress, ep.wMaxPacketSize)

print(ret)
print(hex(ret[0]))
import usb.core
import usb.util

cmd_LineFeed        = [0x0A]
cmd_PaperCutTOTAL   = [0x1d, 0x56, 0x01]
cmd_Status          = [0x10, 0x04, 0x04]

m_Device = usb.core.find(idVendor=0x20d1, idProduct=0x7008)

if(m_Device == None):
    print("device não encontrado")

m_Device.set_configuration()
m_Device.set_configuration()

# get an endpoint instance
cfg = m_Device.get_active_configuration()
intf = cfg[(0,0)]

ep = usb.util.find_descriptor(
    intf,
    # match the first OUT endpoint
    custom_match = \
    lambda e: \
        usb.util.endpoint_direction(e.bEndpointAddress) == \
        usb.util.ENDPOINT_OUT)

assert ep is not None

# ep.write('test')
# for x in range(0,20):
#     ep.write(cmd_LineFeed)
# ep.write(cmd_PaperCutTOTAL)

ep.write(cmd_Status)
ret = m_Device.read(ep.bEndpointAddress, ep.wMaxPacketSize)

print(ret)
print(hex(ret[0]))

A saída do programa é a seguinte:
array('B', [112])
0x70  


A impressora está sem papel, o retorno deveria ser HEX>60 segundo o manual.

Capturar.PNG


Linux - Polegato

unread,
Nov 11, 2022, 9:33:11 AM11/11/22
to python...@googlegroups.com
Olá!

        Para verificar os bits, você de fazer um "and" binário antes de comparar, e vendo que na sua tabela que os bits 5 e 6 devem ser "off" (valor 0) para ter papel e "on" (valor 1) para sem papel, lembrando que o posicionamento dos bits é da direita para esquerda iniciando por 0 (zero), temos:

»»» valor = 0x70
»»» hex(valor)
'0x70'
»»» bin(valor)
'0b1110000'
»»» print(f'valor  binário: {valor:08b}\nposição do bit: 76543210')
valor  binário: 01110000
posição do bit: 76543210

        Vemos então que os bits 5 e 6 estão com valor 1 ("on"), então sem papel.

        Agora para comparar, vamos criar uma variável, que seria assim:

»»» sem_papel = 0x60
»»» hex(sem_papel)
'0x60'
»»» bin(sem_papel)
'0b1100000'
»»» print(f'valor  binário: {sem_papel:08b}\nposição do bit: 76543210')
valor  binário: 01100000
posição do bit: 76543210

        Então a comparação correta seria:

»»» staus_papel = valor & sem_papel
»»» hex(staus_papel)
'0x60'
»»» bin(staus_papel)
'0b1100000'
»»» if staus_papel == sem_papel:
...     print("Sem papel!")
... elif staus_papel == 0:
...     print("Com papel!")
... else:
...     print("Inconsistência!")
...
Sem papel!



[]'s

Junior Polegato


Reply all
Reply to author
Forward
0 new messages