Page 1 sur 1

[RESOLU] ESC/POS

Publié : mer. 06/mai/2020 13:57
par doudouvs
Bonjour,

J'ai plusieurs imprimantes METAPACE SRP-350 350II et 350III pour les testes, pour toutes les 3 c'est le même souci
Quand j'envoi un ESC ca imprime et ca bloque comme si elle attend une trame de fin.

exemple 1 qui marche :

Code : Tout sélectionner

  resu = "Un test"+Chr(10)+"nv ligne test"
printer$ = "-d Bar  "
out = RunProgram("lp",printer$,"",#PB_Program_Open|#PB_Program_Write)
CloseProgram(out)
Exemple 2 ca imprime et ca bloque pas de coupure papier et si on relance ca n'imprime plus

Code : Tout sélectionner

resu = "Chr(27)+Chr(64)+Un test"+Chr(10)+"nv ligne test"
printer$ = "-d Bar  "
out = RunProgram("lp",printer$,"",#PB_Program_Open|#PB_Program_Write)
CloseProgram(out)
Exemple 3 impression d'une chaîne vide, il imprime du coup l'exemple 2

Code : Tout sélectionner

resu = ""
printer$ = "-d Bar  "
out = RunProgram("lp",printer$,"",#PB_Program_Open|#PB_Program_Write)
CloseProgram(out)
PDF des commandes ESC/POS
https://www.jarltech.com/ger_new/new/su ... mmands.pdf


Merci pour vos retours

Re: ESC/POS

Publié : mer. 06/mai/2020 14:35
par Marc56
Dixit la doc générale ESC/POS le code de découpe est:

Hex $1B $69
ASCII ESC i
Decimal 27 105

(pas testé)

Code : Tout sélectionner

resu = "Chr(27)+Chr(64)+Un test"+Chr(10)+"nv ligne test+Chr(27)+Chr(105)" 
:?:

Re: ESC/POS

Publié : mer. 06/mai/2020 15:00
par doudouvs

Code : Tout sélectionner

resu = Chr(27)+Chr(64)+"Un test"+Chr(10)+"nv ligne test"+Chr(27)+Chr(105)
N'imprime rien

si je fait ca il imprime et coupe c'est l'option par défaut

Code : Tout sélectionner

resu = "Un test"+Chr(10)+"nv ligne test"
Le souci et quand je souhaite faire soit un initialisation ou taille de caracter ect... donc a partir du moment ou j'ajoute un ESC plus rien ne s'imprime

Re: ESC/POS

Publié : mer. 06/mai/2020 17:16
par Ollivier
Les flags c'est Open, Read et Write.
resu$ c'est par le data (d'ailleurs on ne voit rien...)

La pipe à Datas

Re: ESC/POS

Publié : jeu. 07/mai/2020 5:50
par doudouvs
Bonjour Olivier,

j'avais déjà fait des testes WriteProgramStringN, WriteProgramString, WriteProgramData voilà le code de teste

Code : Tout sélectionner

Global resu.s
ESCAT.s = Chr(27)+Chr(64) ;Initialize printer ASCII ESC @ Decimal 27 64
SIZE.s = Chr(29)+Chr(102)+Chr(48) ; Select font for Human Readable Interpretation(HRI) characters ASCII GS f n Decimal 29 102 n range n = 0, 1; 48, 49 Font A (12 x 24) Font B (9 x 17)
CUT.s = Chr(27)+Chr(105) ; utliser avec le PPD
resu = ESCAT+"Un test"+Chr(10)+"nv ligne test"

*total = Ascii(resu)

  printer$ = "-d Bar  "
  out = RunProgram("lp",printer$,"",#PB_Program_Open|#PB_Program_Write)
  
  WriteProgramData(out,*total,MemorySize(*total)-1)
  Debug *total
  FreeMemory(*total)
 
  CloseProgram(out)
Il imprime juste "Un test" sans couper le papier et si je relance F5 plus aucun mouvement de l'imprimante

avec se code cela marche normalement mais impossible de rajouter une commande ESC donc pas de mise en page:

Code : Tout sélectionner

resu ="Un test"+Chr(10)+"nv ligne test"

J'ai aussi vérifier du coter des logs rien d'anormale

Code : Tout sélectionner

localhost - - [07/May/2020:06:39:51 +0200] "POST /printers/Bar HTTP/1.1" 200 322 Create-Job successful-ok
localhost - - [07/May/2020:06:39:51 +0200] "POST /printers/Bar HTTP/1.1" 200 254 Send-Document successful-ok
Je vais voir pour écrire directement sur le port je soupçonne que le fait de passer par line printer utilise forcement le driver et que le driver prend la priorité sur les commandes ESC

Re: ESC/POS

Publié : jeu. 07/mai/2020 7:50
par doudouvs
Bon ca commence a donner quelque chose, sauf qu'il cut et imprime après

Code : Tout sélectionner

Global resu.s
ESCAT.s = Chr(27)+Chr(64) ;Initialize printer ASCII ESC @ Decimal 27 64
SIZE.s = Chr(27)+Chr(33)+Chr(1) ; Select font for Human Readable Interpretation(HRI) characters ASCII GS f n Decimal 29 102 n range n = 0, 1; 48, 49 Font A (12 x 24) Font B (9 x 17)
CUT.s = Chr(27)+Chr(105) ; utliser avec le PPD
resu = ESCAT+Chr(10)+"Un test nv ligne test"+Chr(10)+CUT
Debug resu
*total = Ascii(resu)

  imprimante$ = "/dev/usb/lp1"
  
 If OpenSerialPort(Port , imprimante$, 19200, #PB_SerialPort_OddParity, 8, 2, #PB_SerialPort_RtsCtsHandshake, 1024, 1024)
   Delay(60)
   Debug "Succes"
  Else
    Debug "Echec"
  EndIf
  WriteSerialPortData(Port, *total,MemorySize(*total)-1)
    
  Debug *total
  FreeMemory(*total)

Re: ESC/POS

Publié : jeu. 07/mai/2020 8:32
par Marc56
As-tu essayé d'envoyer une autre commande de réinitialisation (Chr(27)+Chr(64)) à la fin ? (puisqu'il coupe lors de l'initialisation)

Re: ESC/POS

Publié : jeu. 07/mai/2020 8:53
par doudouvs
Marc56, olivier

Voila la solution merci pour vos aides :)
je signale quand même que les delay sont obligatoire, javais galérer a trouver quand je communiquer avec un TPE

Code : Tout sélectionner

Global resu.s
ESCAT.s = Chr(27)+Chr(64) ;Initialize printer ASCII ESC @ Decimal 27 64
SIZE.s = Chr(27)+Chr(33)+Chr(1) ; Select font for Human Readable Interpretation(HRI) characters ASCII GS f n Decimal 29 102 n range n = 0, 1; 48, 49 Font A (12 x 24) Font B (9 x 17)
CUT.s = Chr(29)+Chr(86)+Chr(66) ; Cut paper
CENTER.s = Chr(27)+Chr(97)+Chr(49)
LEFT.s = Chr(27)+Chr(97)+Chr(48)
resu = ESCAT+CENTER+"Titre"+Chr(10)+LEFT+"1em ligne"+Chr(10)
*cut = Ascii(CUT)
*total = Ascii(resu)

  imprimante$ = "/dev/usb/lp1"
  
 If OpenSerialPort(Port , imprimante$, 19200, #PB_SerialPort_OddParity, 8, 2, #PB_SerialPort_RtsCtsHandshake, 1024, 1024)
   Delay(60) 
   Debug "Succes"
  Else
    Debug "Echec"
  EndIf
  
  WriteSerialPortData(Port, *total,MemorySize(*total)-1)
  Delay(60)
  WriteSerialPortData(Port, *cut,MemorySize(*total)-1)  
  Delay(60)
  
  Debug *total
  
  FreeMemory(*total)
 CloseSerialPort(Port)

Re: [RESOLU] ESC/POS

Publié : jeu. 07/mai/2020 9:05
par doudouvs
Ah du coup si j'imprime directement sur le port lp je perd les imprimantes réseau Grrrrrrrrrrrr

Re: [RESOLU] ESC/POS

Publié : jeu. 07/mai/2020 10:14
par doudouvs
En utilisant lp par cups il ne ferme pas le port lp1

J'avance mais c'est pas encore propre car on renvoi une chaîne vide au port lp

Code : Tout sélectionner

Global resu.s
;;;;;;;;;;;;;;;;;;;;;
; ouverture du tiroire caisse
;echo -e -n "\x1b\x70\x30\x40\x50" | lpr -o raw -P Bar

Global resu.s
ESCAT.s = Chr(27)+Chr(64) ;Initialize printer ASCII ESC @ Decimal 27 64
SIZE.s = Chr(27)+Chr(33)+Chr(1) ; Select font for Human Readable Interpretation(HRI) characters ASCII GS f n Decimal 29 102 n range n = 0, 1; 48, 49 Font A (12 x 24) Font B (9 x 17)
CUT.s = Chr(29)+Chr(86)+Chr(66) ; gestion par le PPD
CENTER.s = Chr(27)+Chr(97)+Chr(49)
LEFT.s = Chr(27)+Chr(97)+Chr(48)
NULL.s = Chr(0)
resu = ESCAT+CENTER+SIZE+"Titre"+Chr(10)+LEFT+"1em ligne"+Chr(10)

*total = Ascii(resu)
  
  printer$ = "-d Bar  "
  out = RunProgram("lp",printer$,"",#PB_Program_Open|#PB_Program_Write)
  
  WriteProgramData(out,*total,MemorySize(*total)-1)
  FreeMemory(*total)
  Delay(60)
  CloseProgram(out)
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
; la il imprime et libère le port 
  printer$ = "-d Bar  "
  out = RunProgram("lp",printer$,"",#PB_Program_Open|#PB_Program_Write)
  WriteProgramStringN(out,"")
   CloseProgram(out)

Re: [RESOLU] ESC/POS

Publié : jeu. 07/mai/2020 10:58
par doudouvs
Bon la du coup il marche par CUPS avec lp et il CUT bien après l'impression :):):):)

Juste le SIZE vraiment petit, je pense que c'est du réglage

Code : Tout sélectionner

Global resu.s
;;;;;;;;;;;;;;;;;;;;;
; ouverture du tiroire caisse
;echo -e -n "\x1b\x70\x30\x40\x50" | lpr -o raw -P Bar

Global resu.s
ESCAT.s = Chr(27)+Chr(64) ;Initialize printer ASCII ESC @ Decimal 27 64
SIZE.s = Chr(27)+Chr(33)+Chr(2) ; Select font for Human Readable Interpretation(HRI) characters ASCII GS f n Decimal 29 102 n range n = 0, 1; 48, 49 Font A (12 x 24) Font B (9 x 17)
CUT.s = Chr(29)+Chr(86)+Chr(66) ; gestion par le PPD
CENTER.s = Chr(27)+Chr(97)+Chr(49)
LEFT.s = Chr(27)+Chr(97)+Chr(48)
NULL.s = Chr(0)
resu = ESCAT+CENTER+SIZE+"Titre"+Chr(10)+LEFT+"1em ligne"+Chr(10)+CUT

*total = Ascii(resu)
  
  printer$ = "-d Bar "
  out = RunProgram("lp",printer$,"",#PB_Program_Open|#PB_Program_Write)
  
  WriteProgramData(out,*total,MemorySize(*total))
  FreeMemory(*total)
  Delay(60)
  CloseProgram(out)

Re: [RESOLU] ESC/POS

Publié : jeu. 07/mai/2020 10:59
par doudouvs
J'ai un sac remplie de ticket si ça intéresse quelqu'un

Re: [RESOLU] ESC/POS

Publié : jeu. 07/mai/2020 11:20
par Ollivier
Ouch... A force de se faire tanner que les Delay() c'est pas bien...
Franchement merci pour le retour.

Maintenant, à charge de revanche (on va essayer). Là, tu n'utilises que des chaînes donc pas de caractère zéro (null).

Fais un tampon type $55 $01 $33 $80 $0F $01 $55 $80 $33 $01 $0F $80 etc... et envoie-le directement en graphique pour voir si tu peux faire un logo. ($1B $69 $0C $00 en préfixe des codes de pointillés)
(pour faire le tampon, c'est avec PokeA() ).

$55 c'est des pointillés (4 points)
$33 c'est des pointillés moyens (2 traits)
$0F c'est un gros pointillé. (1 trait)

Normalement, ça imprime par colonne de 8 points ou 9 points. Moi c'était 9 aiguilles (en 1991...) Donc ça décalait d'un pixel vers le haut pour chaque colonne.

Re: [RESOLU] ESC/POS

Publié : jeu. 07/mai/2020 12:05
par doudouvs
Aie j'ai pas tout compris, j'ai ca cela coupe juste le papier

Code : Tout sélectionner

*MemoireID = AllocateMemory(5)

PokeA(*MemoireID,$1B)
PokeA(*MemoireID+1,$69)
PokeA(*MemoireID+2,$0C)
PokeA(*MemoireID+3,$00)
PokeA(*MemoireID+4,$55)

  printer$ = "-d Bar "
  out = RunProgram("lp",printer$,"",#PB_Program_Open|#PB_Program_Write)
  Delay(60)

WriteProgramData(out,*MemoireID,5)

Delay(60)
  CloseProgram(out)
    FreeMemory(*MemoireID)  


Re: [RESOLU] ESC/POS

Publié : jeu. 07/mai/2020 16:58
par Ollivier
Ahm merde... Mais moi elle coupait pas le papier... Il y a trente ans... En fait, cherche le mode graphique (au "pixel" près).

Ptêt en inversant :

Code : Tout sélectionner

PokeA(*MemoireID,$1B)
PokeA(*MemoireID+1,$69)
PokeA(*MemoireID+2,$00)
PokeA(*MemoireID+3,$0C)
PokeA(*MemoireID+4,$55)
Ou alors elle coupe le papier parce que tu n'as pas filé toute ma séquence (ça peut être plein de $55 tout simplement)....