mikrocontroller.net

Forum: PC-Programmierung Nadeldrucker per ESC/P steuern


Autor: beta-frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich versuche, einen Epson-Nadeldrucker direkt anzusteuern. Dazu benutze
ich die sogenannten ESC/P-Sequenzen. Das funktioniert soweit auch. Nur
das absolute horiz. Positionieren des Druckkopfes ignoriert er einfach.
Was könnte ich übersehen? Getesteter Beispielcode:

#define ESC 27
#define CR 13

print(ESC); // print() ist die Fkt. zum Zeichensenden an LPT
print('@'); // Druckerreset

print(ESC);
print(36); // 36=='$'==Befehl zum absolutsetzen d. Kopfes
print(55); // ->55" * (1/60) nach rechts (erster Parameter)
print(0);  // ->0" * (256/60) nach rechts (zweiter Parameter)

print('A');
print(CR); // Druckt brav ein 'A'. Leider ganz links :-(

Vielleicht hat ja jemand ne Idee (Jumper vom Drucker hab ich schon
überprüft)

Thx & Gruß - Frank

Autor: beta-frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag: Läuft unter reinem DOS und Ziel ist, den Drucker quasi als
Analogschreiber laufen zu lassen.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm. Nicht jeder Epson-Nadeldrucker verwendet exakt den selben
Befehlssatz - auch wenn Epson das hochtrabend "ESC/P" nennt.

Hast Du "ESC $ n m" dem Druckerhandbuch Deines Druckers entnommen
oder kommt diese Information aus einer anderen Quelle?

Welcher Drucker ist's überhaupt?

Ich habe im Büro noch Unterlagen von sehr alten Epson-Druckern,
MX/RX/FX-80 und könnte da morgen mal 'reinsehen.

Autor: beta-frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Rufus,

der Drucker ist derzeit ein alter FX-85 und "ESC $ n m" stammt aus
dem Handbuch für den FX-85/FX-105.

Allerdings wird später dann ein neuer "ESC/P-kompatibler" zum Einsatz
kommen.

Ich werde den Versatz nach rechts vielleicht besser durch Leerzeichen
erzeugen und auch sonst möglichst wenig Befehle nutzen, wenn der
Befehlssatz erfahrungsgemäß nicht so verlässlich ist....

Danke & Gruß Frank

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit was für einer Art von Programmiersprache machst Du das? Vielleicht
kann die ja beispielsweise keine 0 an den Drucker senden ..

Probier' mal aus, statt 0 1 zu senden:
(mir ist klar, daß dann der Versatz zu breit ist)

0x1b 0x24 0x36 0x01
27   37   55   1

Diese Codesequenz könntest Du auch mal mit 'nem Terminalprogramm an
den Drucker senden und sehen, was dann passiert.
(die 1 wird mit Ctrl+A erzeugt)

Ansonsten: Wie steht der Dip-Schalter SW1-4?
(Ja, ich hab' hier das FX85/105 Manual)

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach auch mal eine Pause zwischen Reset an Drucker und Versatz
Vielleicht überliest er wegen Reset die ESC-Sequence

Wenn alles nicht Hilft: Greif mal im Grafikmodus zu

Gruss

Autor: beta-frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich codiere in C, GNU-Compiler ist DJGPP (mit Allegro-Library für
Grafik und DZCOM-Library für serielle Schnittstelle und FIFO-Queues).
Proggi läuft im protected-mode. Die Daten für den Drucker werden in
einen FIFO geschrieben und dieser an die im BIOS als ECP eingestellte
par. Schnittstelle gegeben, sofern die Daten aufnehmen kann (Drucker
bereit bzw. der 16 Byte-ECP-Puffer nicht voll. ECP verhält sich dem
Drucker gegenüber wie ne normale SPP-LPT) und die Software gerade Zeit
dafür hat.

An einer Pause wird es leider net liegen, denn Sequenzen (Schriftart
einstellen, Text ausgeben) vor der Absolutwertsetzung funktionieren.

Der DIP SW1-4 steht auch auf ESC/P (vorsichtshalber beide Stellungen
probiert) Als Parameter hab ich auch mal
0x1b 0x23 0x01 0x01
27   36    1   1
probiert. Allerdings hast Du "27 <b>37</b> n1 n2" geschrieben. In
meinem Buch steht dort "27 <b>36</b> n1 n2" ?!?!

Grafik kann ich ausgeben, aber ebensowenig positionieren. Schon
komisch, sonst macht der Drucker alles was man ihm sagt...

Dank Euch für Eure Ideen - falls ich's hinkriege, poste ich die
Ursache.

Gruß Frank :-)

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
37 statt 36 wird ein Typo gewesen sein - ich denke nicht in
Dezimalzahlen.

Versuch nochmal
  ESC $ Ctrl-A Ctrl-A
also
  0x1b 0x24 0x01 0x01

an den Drucker zu senden; ESC # macht sicherlich was anderes.


Meinen Tip mit dem Terminalprogramm kannst Du nicht ausprobieren, weil
der Drucker an der Parallelschnittstelle hängt.

Trotzdem ist ein Test recht einfach: Datei mit einem Hexeditor erzeugen
und mit

  copy datei /b prn:

an den Drucker senden.

(Notfalls statt prn lpt1 oder lpt2 angeben.)

Allerschlimmstenfalls kannst Du Dir behelfen, in dem Du "weiss"
druckst, also Drucker in Graphikmodus stellen und n "leere" Bytes
drucken.

  ESC * Ctrl-@ n1 n2  [n * Ctrl-@]

    (Ctrl-@ steht für 0x00)
    8-Bit-Graphikmodus mit 60 Punkten/Zoll

    n1 = n % 256
    n2 = n / 256

Für 4 Bytes also

  0x1b 0x2a 0x00 0x00 0x04 0x00 0x00 0x00 0x00
                 n1   n2

Die "native" Auflösung des Druckers ist übrigens 1/72", damit ist
der horizontale Punktreihenabstand gleich dem durch den Druckkopf fest
vorgegebenen vertikalen.
Statt ESC * Ctrl-@ ist dann ESC * Ctrl-E zu verwenden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.