hallo,
seit Stunden suche ich einfaches Projekt das eine bmp Datei an meinen RS232 Tnt88ii Drucker sendet.
Über google finde ich immerwieder eine Seite:
Printing a Bit map image to pos printer via comport in C#
Auf den ersten Blick Perfekt. Ich rufe GetLogo() auf, aber wo baue ich das Stück Code ein?
SerialPort port = new SerialPort("com6", 9100, Parity.None, 8, StopBits.One);
port.Open();
port.Write("Some Text");
port.Close();
Da wird die Schnittstelle geöffnet und gleiche wieder geschlossen oder wie ?!
Bei Code bitte [csharp[nop][/nop]]-Tags verwenden und Linknamen setzen, anstatt nur den Link posten. Siehe auch [Hinweis] Wie poste ich richtig?
nööö
Warum liest Du den von Dir genannten Thread nicht ganz durch?
Da steht doch alles.
Der Eingangspost, den Du hier zitierst, hat ja recht wenig mit der zu beantwortenden Frage zutun.
Das, was zählt, ist das Kommentar
You'll need to read the printer manufacturer's programming manual so you'll know what bytes to send to the printer.
Und dann weisst Du auch wo man GetLogo verwendet.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
nööö, das bezieht sich auf:
SerialPort port = new SerialPort("com1", 9600, Parity.None, 8, StopBits.One);
Der Port ist jetzt konfiguriert für meinen Drucker. 😃
... und wie baut ich jetzt den code in den Hauptcode ein?
nööö
update...
Das Hauptprogramm, deren Knopf um ein Testdruck zu starten:
ESCPrint printer = new ESCPrint();
printer.start();
printer.alignment(1); //druckt das Logo
printer.close();
Grundkonfiguration des Druckers:
.....cut
namespace Kasseblablal
{
public class ESCPrint
{
private SerialPort Drucker;
public ESCPrint()
{
Drucker = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
}
public ESCPrint(string com, int baud, Parity par, StopBits st)
{
Drucker = new SerialPort(com, baud, par, 8, st);
}
public void start()
{
Drucker.Open();
Drucker.Write(Convert.ToChar(27) + "@");
Drucker.Write(Convert.ToChar(27) + "c" + "0" + "3"); // druckt 3
}
public void close()
{
Drucker.Close();
}
...cut
Der Teil druckt das Logo:
public void alignment(int status) // [0,1, 2] für links, mitte, rechts \r\n
{
Drucker.Write("\x1B\x70\x00\x64\x64"); // macht die Kassenschubelade auf.
BitmapData data;
using (var bitmap = (Bitmap)Image.FromFile("C:\\logo.jpg"))
{
var threshold = 127;
var index = 0;
double multiplier = 570; // this depends on your printer model. for Beiyang you should use 1000
double scale = (double)(multiplier / (double)bitmap.Width);
int xheight = (int)(bitmap.Height * scale);
int xwidth = (int)(bitmap.Width * scale);
var dots = new BitArray(xwidth * xheight);
for (var y = 0; y < xheight; y++)
{
for (var x = 0; x < xwidth; x++)
{
var _x = (int)(x / scale);
var _y = (int)(y / scale);
var color = bitmap.GetPixel(_x, _y);
var luminance = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
dots[index] = (luminance < threshold);
index++;
}
}
////////////////////TEil 2
byte[] width = BitConverter.GetBytes((int)(bitmap.Width * scale));
int offset = 0;
MemoryStream stream = new MemoryStream();
BinaryWriter bw = new BinaryWriter(stream);
bw.Write((char)0x1B);
bw.Write('@');
bw.Write((char)0x1B);
bw.Write('3');
bw.Write((byte)24);
while (offset < (int)(bitmap.Width * scale))
{
bw.Write((char)0x1B);
bw.Write('*'); // bit-image mode
bw.Write((byte)33); // 24-dot double-density
bw.Write(width[0]); // width low byte
bw.Write(width[1]); // width high byte
for (int x = 0; x < (int)(bitmap.Width * scale); ++x)
{
for (int k = 0; k < 3; ++k)
{
byte slice = 0;
for (int b = 0; b < 8; ++b)
{
int y = (((offset / 8) + k) * 8) + b;
// Calculate the location of the pixel we want in the bit array.
// It'll be at (y * width) + x.
int i = (y * (int)(bitmap.Width * scale)) + x;
// If the image is shorter than 24 dots, pad with zero.
bool v = false;
if (i < dots.Length)
{
v = dots[i];
}
slice |= (byte)((v ? 1 : 0) << (7 - b));
}
bw.Write(slice);
}
}
offset += 24;
bw.Write((char)0x0A);
}
// Restore the line spacing to the default of 30 dots.
bw.Write((char)0x1B);
bw.Write('3');
bw.Write((byte)30);
bw.Flush();
byte[] bytes = stream.ToArray();
// return logo + Encoding.Default.GetString(bytes);
Drucker.Write(Encoding.Default.GetString(bytes));
///////////////bmp ende !!!
}
}
Zu meinem Problem:
Der Drucker druckt das Logo raus.ABER nach 95% drucken hört der Drucker auf und die Fehler LED linkt immer 4 mal.
Ich habe die Anzahl der Pixel verringert. Der Druck ist identisch. Dann habe ich die Pixel nochmal verringert und wieder nach 95 % ist Feierabend, außer dass die Qualität schlechter ist.
ICH BIN FÜR JEDEN TIPP 1000 MAL DANKBAR.
nööö
Das blinken der Drucker LED indiziert das Problem, soweit ich weiß.
Laut Technischer Referenz des Druckers könnte es sich bei dem Blink-Muster um einen CPU-Anweisungsfehler handeln:
PDF Technische Referenz
Das bedeutet wohl das der Drucker irgendwie nicht mit den Anweisungen klar kommt.
Ein weiteres Problem das ich kenne:
Wenn der Empfangspuffer des Druckers voll ist, verwirft der Drucker alle weiter eingehenden Anweisungen. Dies führt dann zu dem Verhalten der Drucker nur einen Teil der gesendeten Anweisungen verarbeitet und der Rest "verloren geht"
Hier mußt du mal prüfen wie groß der Empfangspuffer des Druckers ist (war glaube ich irgendwo bei 4kb oder so) und wie groß der Bitstream ist den du versuchst zu senden.
Wenn alles scheitert, den Drucker mal in den Debug Modus schalten (-> Handbuch des Druckers) und dann den Hexdump des Druckers mit den gesendeten Anweisungen vergleichen und sehen ob das wirklich alles stimmt.
thx,
ein guter Denkanstoss.
double scale = (double)(multiplier / (double)bitmap.Width)/2; ////// geändert
Das Logo ist um 1/4 kleiner und der Drucker stürtzt nicht ab
nööö
eine Frage zu meinem Druckerproblem:
sobald ich ein üöä߀ drucke bekomme ich immer nur ein ?.
z.B. für druckt f?r
Laut dem Manual...
http://www.pwks.de/driver/PDF/t88i2.pdf
.....
Drucker.Write(Convert.ToChar(27) + "\x1B" + "\x52" + "\2");
Auf dem Papier ist R2
nööö
Hmmm, wenn ich mich richtig entsinne (ist schon ein Weilchen her das ich das gemacht habe)
könnte das mit dem eingestellten Zeichensatz des Druckers zusammen hängen.
Verwende den Befehl "ESC t" um den Zeichensatz zu aktivieren:
ESC-POS Befehlsreferenz (Seite 12)
thx,
-------die pdf--------
ESC t n
[Name] Select character code table
[Format] ASCII ESC t n
Hex 1B 74 n
Mutilan German blabla -->> 2
----------ende--------
Drucker.Write(Convert.ToChar(27) + "@"); // Drucker initialisieren ESC @
Drucker.Write("\x1B" + "\x52" + "\x02"); // die Multilan German...
Drucker.Write("äü" + "0" + "3"); // die Drucksache....
er druckt ??03
nööö
Hmmm, ich weiß ja nicht, aber mir scheint ja das da was falsch läuft:
Also genügend Dinge zum ausprobieren um das Problem weiter einzugrenzen 😉
vielen vielen vielen Dank !!!!
ok, so weit bin ich gekommen, zum größten Teil habe ich herumprobiert 😃
Drucker.Write(Convert.ToChar(27) + "@");
Drucker.Write("\x1B" + "\x52" + "\x02"); //
Drucker.Write("x" + "\x7B\x7C\x7D\x7E\x7E\x5B\x5C\x5D\x5E\x5E" + "x");
Er druckt jetzt:
xäöüßßÄÖÜ^^x
WO IST DAS € Zeichen ????
Sch**s Euro !!!
nööö
In dem ersten von mir geposteten PDF ist ab Seite 73 die "Character Code Reference" drin.
Da findest du genau welches Zeichen in welcher Codepage durch welchen Hexwert abgebildet wird.
Damit solltest du das € finden können ohne zu raten 😉