IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

[Pyserial] impression metapace


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 35
    Par défaut [Pyserial] impression metapace
    Bonjour à tous,

    Debutant en python, j'essaye d'imprimer un texte sur une imprimante thermique via le module Pyserial.

    J'ai une imprimante thermique (Metapace T-1), branché au port serie.
    et un tiroir caisse (Metapace K-2), branché via un cable rj11 à l'imprimante.

    J'utilise Python 3.3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import serial
    imp = serial.Serial(0)  
    texte = "Test d'impression"
    imp.write(texte)
    imp.close()
    L'impression fonctionne, cependant voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ÇÇxÇxÇxxxÇxxxÇÇxÇÇxxxÇxÇxÇxÇxxxxÇxÇx°xǰx°
    xxxÇxǰxxxÇxÇxxxx°xÇxxxxÇxÇÇxxxǰxÇÇx°x°xǰ
    Quequ'un saurait en quelle langue me réponds l'imprimante ?

    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    En python 3 vous utiliser du type bytes et non str, du coup je pense que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imp.write(bytes(texte))
    pourrait fonctionner, je ne connais pas suffisamment pyserial pour en être sûr

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 35
    Par défaut
    Bonjour fred et merci pour ta participation, malheureusement rien ne fonctionne...

    Petite récap :

    J'ai un ami qui a besoin d'un logiciel de caisse pour son restaurant (que je recommande ), cependant, j'ai l'habitude de developper en php/mysql, et j'ai quelque connaissance en C++. Donc très peu de compétence pour developper un véritable logiciel...
    Mais etant très curieux de nature, et fier admirateur d'Einstein (ref ta signature), je me suis dit "allons-y !"
    J'ai reflechi au language que je souhaitais utiliser pour son programme et j'ai toute de suite eté émerveiller par les capacités de Python. (surtout la librairie TK)

    Donc depuis quelques semaines, j'ai lu et tester les divers tutos disponibles sur le net pour Python. Aujourd'hui, je devrait être capable de developper la partie graphique de son logiciel, mais 2 choses primordiales me pose problème :

    * - L'impression des tickets de caisse
    * - l'ouverture du tiroir caisse

    Je ne me suis pas encore penché sur l'ouverture du tiroir caisse, je verrais ça après l'impression.


    Retour au mouton PySerial:

    Voiçi le code simplifié que j'utilise comme test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import serial
    ser = serial.Serial(0)
    ser.write("TEST impression")
    ser.close()
    Le résultat ne change pas, des "ç" des "x" et des "°"

    J'ai testé avec un type "bytes" et "unicode", j'ai essayé d'envoyer des l'INT
    Et je comprends pas comment on envoie les codes du "Manuel des codes" du constructeur, J'ai lu toutes la doc de pyserial sur sourceforge, rien ne parle de ce 'language' bizarre,

    J'ai quand même trouvé ce script intéréssant, mais y'a tellement de réecriture de variables et de fonctions pas intéressante dans mon cas que j'ai du mal à décripter (et oui je suis débutant)

    Après reflexion je me demande si le code çx° blabla ne serait pas un message d'erreur plutôt qu'une interprétation de ma string.

    J'ai oublié de signaler que je test actuellement le code sous "Windows seven edition familiale Premium" qui normalement devrait dégager une fois le programme terminé...

    Amicalement,
    Fabien493

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    En première approximation, si vous avez du garbage en sortie d'un port RS232, c'est que le setup baudrate, parity, bitsize, stopbits sont incorrects.

    Par défaut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    >>> ser = serial.Serial(0)
    suppose “9600,8,N,1”, no timeout:

    Les valeurs a leur assigner dépendent de la configuration du "printer".

    Ceci dit, je suppose que vous vous êtes assure que la connectique fonctionne et réussi a imprimer une page de test.

    Reste que un "printer" thermique est un engin particulier: si vous voulez imprimer quelque chose, il faut peut être lui encapsuler les bytes correspondants dans les commandes qui vont bien (d'autres bytes):
    Écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ser.write("TEST impression")
    peut produire l'impression de la suite de caractères "TEST impression"... ou pas car il manque la commande magique disant "imprime les N bytes qui suivent sans les interpréter comme "commande".

    C'est pour cela que le constructeur livre un manuel de codes.
    Vous avez pu constater que le code Python pour le printer "Adafruit" que vous avez mentionne ne se réduit pas a ser.write(...): votre printer avale d'autres commandes...
    Il faudra coder un truc semblable pour adapter le printer a vos besoins.
    Mais pour l'instant, vous en êtes a essayez de comprendre comment causer au printer pour qu'il imprime "TEST impression", c'est dans le manuel du constructeur que sont les réponses qu'il faudra traduire avec Pyserial.

    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 35
    Par défaut
    Bonjour wiztricks, merci de ta participation.

    Effectivement comme tu le signale, j'utilise le "serial.Serial(0)" pour récupérer les informations du printer sur le COM1 via la directive "getSettingsDict()"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ser = serial.Serial(port"COM1",baudrate=9600,bytesize=8,parity="N",stopbits=1)
    J'ai essayé d'imprimer en utilisant les différents codes de imprimante en ASCII : Langue, mode, ect... les codes fonctionnes, mais l'imprimante continue à m'insulter...

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ser.write("ESC@")
    ser.write("ESCR1")
    ser.write("TEST impression")
    ser.write("LF")
    toujours la même erreur...

    J'ai récupéré dans la doc des informations utiles :


    et un autre exemple de projet : Py-thermal-printer

    mais tout mes tests ont échoués. Toujours une réponse ç x ° de l'imprimante.

    Sans solution via Pyserial, je pense être obligé ou de rester sous Windows avec le driver officiel. Ou peut être tester avec Cups sous linux. A voir.

    Cependant, le mieux étant de le codé directement dans le programme.

    Si quelqu'un à une idée, je suis preneur car la je n'ai plus d'idée...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Relisez les codes que vous avez récupéré.
    write("ESC@") expedie 4 bytes sur le port serie alors que vous devriez expedier ESC = chr(27), puis @.
    Vous devriez avoir une configuration du printer qui affiche les codes ASCII des bytes reçus - au lieu de les interpréter, imprimer.

    mais tout mes tests ont échoués. Toujours une réponse ç x ° de l'imprimante.

    Sans solution via Pyserial, je pense être obligé ou de rester sous Windows avec le driver officiel. Ou peut être tester avec Cups sous linux.
    Sans trop comprendre ce que vous faites, vous testez surtout votre savoir faire et rien d'autre.

    Je ne sais pas trop comment vous bossez.

    Lorsque j'ai a réaliser ce genre d'application, les périphériques sont des "détails" d’implémentation: je peux coder et réaliser "sans" les vrais périphériques en réalisant:
    • une interface qui présente ce que l'application en attend et
    • un simulateur qui prenne en compte leur caractéristiques techniques "high level" - un widget Text tkinter pourrait très bien faire l'affaire cote visualisation.

    Une fois que l'application "fonctionne", il suffit de remplacer le simulateur par le vrai périphérique. Comme il n'y a qu'a réaliser ce qu'attend l'interface, c'est beaucoup plus "petit" qu'interfacer le device "en général", le plan de test est facile a définir et évite de perdre du temps a coder des fonctionnalité qui ne serviront pas.

    L'autre intérêt est d'avoir des spécifications: ce qui est attendu sera défini par l'interface. On peut éventuellement trouver/solliciter un expert qui pourra réaliser cela en quelques heures/jours.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [CR][VB6] Impression d'un état depuis VB
    Par sda dans le forum SDK
    Réponses: 3
    Dernier message: 06/02/2007, 17h27
  2. Quick Report et impression de données hors BDD
    Par gRRosminet dans le forum C++Builder
    Réponses: 8
    Dernier message: 19/08/2002, 09h47
  3. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  4. Impression d'image bmp
    Par Invité dans le forum Langage
    Réponses: 6
    Dernier message: 18/07/2002, 09h38
  5. Problème d'impression
    Par IngBen dans le forum C++Builder
    Réponses: 7
    Dernier message: 22/05/2002, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo