Drucker: escape-Sequenzen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Drucker: escape-Sequenzen

Beitrag von malabarista »

ich möchte an den Drucker (Thermoprinter, endlos) ESC-Sequenzen schicken.
ich habe es versucht mit

Code: Alles auswählen

 
z:=chr(27)+chr(69)+'test'+chr(27)+chr(70)+'mehr text';
Canvas.TextOut(x,y,z);
 

Aber da hat er wirklich chr(69) (=E) bzw. chr(70) (=F) gedruckt

Oder muss der Drucker völlig anders angesteuert werden ?

Zurzeit mache ich es so:

Code: Alles auswählen

 
   with Printer do
   try
     BeginDoc;
     x:=30;
     Canvas.Font.Name := 'Courier New';
     Canvas.Font.Size := 9
     Canvas.Font.Color := clBlack;
     yabs:= Round(1.2 * Abs(Canvas.TextHeight('I')));
     y:=yabs;
     for i:=0 to ianz-1 do
       begin
       z:=drucklist[i];
       Canvas.TextOut(x,y,z);
       y:=y+yabs;
       end;
   finally
     EndDoc;
 

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Drucker: escape-Sequenzen

Beitrag von Mathias »

Mit Canvas.TextOut kannst dies sowieso vergessen, das ist das selbe, wie man Canvas.TextOut auf dem Fomr macht.

Oder muss der Drucker völlig anders angesteuert werden ?

Ich denke, das wird anders gehen, die ESC-Sequenzen kommen noch aus dem DOS-Zeitalter.
Die Frage, versteht dein Thermo-Printer überhaupt ESC-Sequenzen ?

Dies wäre der Weg, auf einem alten Epson-Drucker:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var f:Text;
begin
  AssignFile(f, 'LPT1');
  Rewrite(f);
  WriteLn(f, 'Hello World');
  WriteLn(f, #27#40#111#49#83); // sollte Kursiv sein
  WriteLn(f, 'Hello World');
 
  CloseFile(f);
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Drucker: escape-Sequenzen

Beitrag von malabarista »

Ja, der Drucker versteht ESC-Sequenzen.

Er ist allerdings nicht auf LPT1: angeschlossen (ja, so war das früher mal), sondern an einem USB-Port.
Und mit dem Assignfile kann ich leider nicht den Druckernamen übergeben: das klappt nicht.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Drucker: escape-Sequenzen

Beitrag von wp_xyz »


malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Drucker: escape-Sequenzen

Beitrag von malabarista »

So, nun habe ich die Lösung.
Man muss den printer in den rawmode versetzen, dann kann man esc-Sequenzen übergeben.
Alle Varianten den Druckernamen zu übergeben scheiterten (mindestens unter linux)

Code: Alles auswählen

 
Printer.SetPrinter(drucker);
Printer.RawMode := True;
Printer.BeginDoc;
PrintSample;
Printer.EndDoc;           
 

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Drucker: escape-Sequenzen

Beitrag von malabarista »

Ich habe noch eine Möglichkeit (delphi) gefunden, die ich allerdings nicht compiliert bekomme:
Passthrough und escape sind unbekannt.
Vielleicht weiss jemand, welche units dafür eingebunden werden müssen.

Code: Alles auswählen

 
function DirectToPrinter(S: string; NextLine: Boolean): Boolean;
var
  Buff: TPrnBuffRec;
  TestInt: Integer;
begin
  TestInt := PassThrough;
  if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TESTINT), @testint, nil) > 0 then
  begin
    if NextLine then  S := S + #13 + #10;
    StrPCopy(Buff.Buff_1, S);
    Buff.bufflength := StrLen(Buff.Buff_1);
    Escape(Printer.Canvas.Handle, Passthrough, 0, @buff, nil);
    Result := True;
  end
  else
    Result := False;
end;                                               
 

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Drucker: escape-Sequenzen

Beitrag von theo »


Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Drucker: escape-Sequenzen

Beitrag von Mathias »

Ich habe mal folgendes auf eine PDF-Druck probiert (cups-pdf), aber dieser scheint Probleme mit Steuerzeichen zu haben. Einzige was geht ist #13#10.

Code: Alles auswählen

  Printer.RawMode := True;
  Printer.BeginDoc;
  Printer.Write('Hello world'#13#10);
  Printer.Write(#27#52);
 
  Printer.Write('Hello world');
  Printer.EndDoc;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Drucker: escape-Sequenzen

Beitrag von NoCee »

Hallo,
ich kenne Thermodrucker in primitivausführung.
Niedrige Auflösung, serielle Schnittstelle RS232/TTL.
Wenn die dann einen USB Anschluß haben, ist ein USB>RS232 Wandler
eingebaut. Oft heißt das, der Rechner druckt über eine virtuelle Com-Schnittstelle.
Die "Esc"-Sequenz heißt hier dass Steuerfunktionen die übertragen werden sollen,
mit einem speziellen Steuerzeichen eingeleitet werden, damit der Drucker weiß
die folgenden ein, zwei oder drei Bytes sollen nicht gedruckt werden sondern
stellen eine Steuerungsfunktion dar.
Damit kann man dann je nach Drucker z.B. die Schrifftart, Schrifftgröße,
Schrifftinvertierung (weiße Schrifft auf dunklem Hintergrund) usw. verändern.
Damit kann man bei einem Bondrucker am Kassensystem z.B. auch den Bon abschneiden lassen.
Esc+Sequenz für "Cut"
Das ganze ist so einfach gehalten, dass ich das ohne Druckertreiber sogar
mit einem kleinen Mikrocontroller ansteuern kann.
Dein z:=chr(27)+chr(69)+'test'+chr(27)+chr(70)+'mehr text'
müßte in dem Fall nur an die serielle Schnittstelle gesendet werden.
Mit Synaser z.B.: ser.SendString(z);
Ich weiß natürlich nicht, was du für einen Drucker in der Mache hast.

Gruß
NoCee

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Drucker: escape-Sequenzen

Beitrag von malabarista »

Wie ich bereits schrieb: es gibt keine serielle Schnittstelle. Weder am PC noch am Drucker. Deshalb kannst du da auch nichts hinsenden.

NoCee
Beiträge: 170
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: Drucker: escape-Sequenzen

Beitrag von NoCee »

Die serielle Schnittstelle die ich meinte ist auch nur im Drucker eingebaut.
Mehrere Drucker die ich kenne, gibt's mit einer RS232 oder mit USB oder mit Netzwerk.
Intern unterscheiden die sich aber nur in einer kleinen Platine, die entweder RS232, USB oder Ethernet zu TTL-Logik
wandelt damit Drucker intern ein UART oder sowas damit angesteuert werden kann.
Beim USB ist dann oft im Drucker ein FTDI Chip verbaut, der am PC einen virtuellen Comport darstellt.
Diesen Comport siehst du dann in nicht von außen am PC sondern nur im Gerätemanager
(vorrausgesetzt der FTDI-Comtreiber ist installiert)

Aber wie ich schon schrieb, muß das bei dir ja nicht so sein.

Aber noch was zum Drucken im Raw-Mode.
Wenn du den Drucker in den Raw-Mode versetzt, druckt dieser vermutlich nicht das was du drucken willst, sonder
das was über die Schnittstelle kommt und das vermutlich in hex.
Der Modus wird unter anderem zum Testen verwendet ob das ankommt was man dem Drucker senden will.

Gruß
NoCee

Antworten