Laden...

Ein Bild an den Pos Drucker senden...

Erstellt von tomycat vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.995 Views
T
tomycat Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren
Ein Bild an den Pos Drucker senden...

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 ?!

Hinweis von gfoidl vor 8 Jahren

Bei Code bitte [csharp[nop][/nop]]-Tags verwenden und Linknamen setzen, anstatt nur den Link posten. Siehe auch [Hinweis] Wie poste ich richtig?

nööö

16.835 Beiträge seit 2008
vor 8 Jahren

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.

T
tomycat Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

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ööö

T
tomycat Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

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ööö

127 Beiträge seit 2015
vor 8 Jahren

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.

T
tomycat Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

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ööö

T
tomycat Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

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ööö

127 Beiträge seit 2015
vor 8 Jahren

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)

T
tomycat Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

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ööö

127 Beiträge seit 2015
vor 8 Jahren

Hmmm, ich weiß ja nicht, aber mir scheint ja das da was falsch läuft:

  1. Dein PDF scheint veraltet zu sein. Es ist von 1996 und scheint nur für den TM-88 zu sein, nicht deren Nachfolger Modell II etc.
  2. In meinem PDF ist der Befehl ESC T für die Codepage und in deinem Dokument ist es für die Druckrichtung
  3. In meinem PDF ist der Befehl ESC T = \x1B \x74 (Nicht wie in deinem \x1B \x52)
  4. Wenn 2 als Codepage (laut meinem PDF PC 850 (Multilingual) nicht funktioniert, probier mal die anderen Codepages wie zum Beispiel: 19 PC 858 (EURO))

Also genügend Dinge zum ausprobieren um das Problem weiter einzugrenzen 😉

T
tomycat Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

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ööö

127 Beiträge seit 2015
vor 8 Jahren

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 😉

T
tomycat Themenstarter:in
11 Beiträge seit 2015
vor 8 Jahren

thx,
alles was über /x80 ist macht er mit ein -->> ? <<--

nööö