Newsgroup: it.comp.lang.delphi
Titolo: Funzione escape di windows

Ciao a tutti!
 
Sto cercando di interfacciare una stampante con il protocollo esc/pos.
Oltre ai comandi di stampa ha anche dei comandi per avere informazioni sullo stato.
Documentandomi un po' ho scoperto che si può usare la funzione ESCAPE delle API di Windows.
Seguendo i vari esempi ho trovato che per stampare si può fare così:
 
procedure stampa(s: string)
 
type
TPassThroughData = record
nLen: Integer;
Data: array[0..255] of Byte;
end;
 
var
PTBlock: TPassThroughData;
begin
 
Printer.BeginDoc;
 
PTBlock.nLen := Length(s);
StrPCopy(@PTBlock.Data, s);
Escape(Printer.Handle, PASSTHROUGH, 0, @PTBlock, nil);
 
Printer.EndDoc;
 
end;
 
e fino a qui tutto bene.
Per leggere cosa mi risponde la stampante, basandomi su quanto dicono le api dovrei fare una cosa del genere:
 
procedure stampa(s: string)
 
type
TPassThroughData = record
nLen: Integer;
Data: array[0..255] of Byte;
end;
 
var
PTBlock: TPassThroughData;
PTReplica: TPassThroughData;
begin
 
Printer.BeginDoc;
 
PTBlock.nLen := Length(s);
StrPCopy(@PTBlock.Data, s);
 
Replica.nLen := 8; //la risposta secondo manuale 
 
Escape(Printer.Handle, PASSTHROUGH, 0, @PTBlock, @PTReplica);
 
Printer.EndDoc;
 
end;
 
Quando tento di eseguire stampa con i comandi di interrogazione e analizzo PTReplica non ottengo quello che mi aspetto.
Cercando in Google vedo che non sono l'unico con questo problema.. Qualcuno di voi saprebbe aiutarmi?
Grazie :-)

> non ottengo quello che mi aspetto.
 
...cioe...?
 
A.
 


Se ad esempio invio il comando di identificazione la stampante dovrebbe rispondere con 23 byte (es: KMS-324-HRS       XX.YY), ma se in debug analizzo i dati ottengo dei valori che non centrano nulla.. 

 Se ad esempio invio il comando di identificazione la stampante dovrebbe rispondere con 23 byte (es: KMS-324-HRS       XX.YY), ma se in debug analizzo i dati ottengo dei valori che non centrano nulla.. 
 
Perché i dati possano centrare qualcosa gli devi dare un bersaglio prima :-D
 
A parte scherzi e parlando da ignorante (mai sentite 'ste sequenze di
escape), credo che il comando escape ritorni dei dati dal driver della
stampante (o dal firmware di questa) invece che da Windows. Se il driver
o il firmware non rispettano i comandi di escape, windows non può farci
niente. Ma poi, sono comandi standard? Perché sennò col cavolo che
funzioneranno su tutte le stampanti...
 


Io sono ancora più ignorante di te :-) I comandi fanno parte di uno standard, ma variano da stampante a stampante.. Cosa potrei fare secondo te?

 I comandi fanno parte di uno standard, ma variano da stampante a stampante..
 
E allora sei abbastanza fregato... a meno che non contatti tutte le case
più importanti per farti dire i comandi che adottano: è un pò
un'impresa, ma dipende da cosa stai facendo tu, magari vale la pena.
 
Detto questo e tornando al problema contingente: non sarà che la stringa
che ti ritorna è unicode? Prova a vedere...

Curiosità, se puoi e vuoi....
Perchè hai necessità di scendere cosi a basso livello?
Magari ci sono altre soluzioni...
 
A.


Il protocollo della mia stampante ce l'ho.. La stringa che ritorna sembra essere valori a caso più che unicode..


Certo che si può! ;-)
Tramite un comando la stampante mi informa a che livello è arrivata con la carta, se è vicina al livello di End Of Paper allora avviso il gestore dell'impianto dove è collocato il kiosk di caricare la carta.

 dove è collocato il kiosk di caricare la carta.
 
Pero'...... carina sta cosa.
Ok..mi sa che ti tocca andare a basso livello.
Domanda: quale driver usi? Quello standard di windows o un driver fornito dal produttore?
Se usi quello di winzozz non mi stupisco dei dati cinofallici.
E' gia un miracolo che si riesca a stampare.... :-D
 
A.
 
 


Utilizzo quello fornito dal produttore.
Se uso la loro demo funziona tutto egregiamente, se provo io non va una cippa :-(

 Se uso la loro demo funziona tutto egregiamente, se provo io non va una cippa 
 
xche non chiedi al produttore un esempio di come usano le api di winzozz?
 
A.
 
 
 
 

 Se uso la loro demo funziona tutto egregiamente, se provo io non va una cippa :-(
 
La demo e' un exe gia' fatto o hai dei sorgenti ?
 
ciao
Giacomo
 

Ciao,
  mi intrometto ....
 
Non tutte le stampanti usano le sequenze ESC e tra quelle che le usano non 
e' detto che la stessa sequenza che funziona su di una stampante dia
lo stesso risultato sulle altre.
 
In passato ho cercato di sapere lo stato della stampante, lo stato del 
cassetto della carta, lo stato del coperchio della stampante ecc... ma non 
era poi
cosi' immediato perche' c'e' sempre windows in mezzo !!!
 
Comunque, tornando alle sequenza di ESC prova a leggere qui
 
http://www.delphigroups.info/2/0e/520296.html
 
 
dove l'unico problema e' recuperare la unti che sembra introvabile.
Certo e' un post vecchio .... ma sempre utile !!
 
In alternativa prova la leggere qui
 
http://stackoverflow.com/questions/5936511/correct-way-to-send-commands-directly-to-printer
 
 
che ti rimanda qui
 
https://groups.google.com/forum/#!topic/borland.public.delphi.winapi/JeSSdvJKf_o
 
 
per la unit.
E' ancora piu' datata della prima ... ma almeno e' ben documentata e magari 
non servono neanche tante modifiche per farla andare.
 
Ciao
 
Daniele