Data wykonania ćwiczenia: 04.11.2014 r.
Data oddania sprawozdania: 14.11.2014 r.
Prowadzący: dr inż. Jan Nikodem Wydział Elektroniki, Informatyka
Grupa:
Termin: Wt TN 13:15
Sprawozdanie z laboratorium
Urządzenia Peryferyjne
Ćwiczenie 2
Drukarki atramentowe. Język PCL. Drukowanie w kolorach
Cel ćwiczenia:
Celem ćwiczenia było wykonanie wydruków przy użyciu drukarki atramentowej HP DeskJet 870 podłączonej do komputera za pomocą portu LPT. Do sterowania drukarką używaliśmy języka komend PCL. Do zrealizowania były dwa zadania – wydruk tekstu o konfigurowalnym rozmiarze, kolorze i stylu oraz wydruk kolorowej, rastrowej grafiki.
Język PCL
Do komunikacji z drukarką używaliśmy języka PCL (Printer Command Language). Język ten został opracowany w latach 80. przez firmę HP i służy do opisu stron. PCL jest językiem, w którym wszelkie komendy sterujące przeznaczone dla drukarki zaszyte są w tekście (z wyjątkiem grafiki rastrowej, gdzie kolejne bity stanowią argumenty komend). W języku tym określony jest zestaw komend do formatowania drukowanego tekstu i obrazu. Komendy te mają reprezentację tekstową, t.j. są łańuchem znaków. Mogą przyjmować argumenty. Każda komenda rozpoczyna się znakiem escape (kod ASCII 27). Po tym znaku następują następne określające rodzaj komendy. Na końcu znajduje się znak kończący (różniący się w zależności od komendy), który informuje drukarkę o zakończeniu komendy.
Program
Nasz program umożliwia przesłanie do drukarki celem wydrukowania danych tekstowych oraz grafiki rastrowej. W oknie programu użytkownik może wprowadzić tekst, jaki ma zostać wydrukowany, a także dokonać jego podstawowego formatowania. Do wyboru są:
Wybór stylu czcionki (pogrubiona, podkreślona, kursywa)
Wybór kroju czcionki (Times New Roman, Arial)
Wybór koloru czcionki (zielony, czerwony, niebieski, czarny)
Wybór rozmiaru czcionki (zmniejszony, normalny, zwiększony).
Wydruk następuje po naciśnięciu przycisku „Drukuj tekst”.
Program umożliwia wydrukowanie wcześniej zaprogramowanej grafiki rastrowej, takiej, jak poniżej:
Grafika zapisana jest w poszczególnych bajtów, które wysyłane są wraz z komendami. Wydruk grafiki następuje po naciśnięciu przycisku „Drukuj grafikę”.
Druk tekstu czarno-białego i częściowo kolorowego przetestowaliśmy na drukarce w laboratorium, natomiast resztę funkcjonalności sprawdzaliśmy programami OpenPCL Viewer i WinPCLtoPDF.
Kody źródłowe:
Kod.cpp
#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;
char esc = 27;
void wydruk(CString Tekst, bool Podkreslenie, bool Pogrubienie, bool Kursywa, int czcionka,
int rozmiar,int kolor)
{
char c[50];
for (int i = 0; i < Tekst.GetLength(); i++)
c[i] = Tekst[i];
c[Tekst.GetLength()] = 0;
fstream lpt;
lpt.open("LPT3", ios::out);
lpt << esc << "E" << endl; //reset drukarki
lpt << esc << "&s0C" << endl; //zawijanie wierszy
lpt << esc << "&l0O" << endl; //orientacja pionowa
lpt << esc << "*o0M" << endl; //jakosc normalna
lpt << esc << "&l26A" << endl; //format A4
lpt << esc << "&a5C" << endl; //margines
lpt << esc << "&a4R" << endl; //
lpt << esc << "(s1p" << endl;
lpt << esc << "(16v" << endl;
lpt << esc << "(0s" << endl;
lpt << esc << "(0b" << endl;
if (czcionka == 1)
lpt << esc << "(4101T" << endl; //czcionka time
if (czcionka==2)
lpt << esc << "(16602T" << endl; //czcionka Arial
if (Podkreslenie)
lpt << esc << "&d3D"<<endl;
lpt << esc << "(s1p" << endl;
switch (rozmiar)
{
case 1:
lpt << esc << "(s20V" << endl; //rozmiar czcionki mniejszy
break;
case 2:
lpt << esc << "(s40V" << endl; //rozmiar czcionki mniejszy
break;
case 3:
lpt << esc << "(s60V" << endl; //rozmiar czcionki mniejszy
break;
default:
lpt << esc << "(s40V" << endl;
break;
}
if (Kursywa)
lpt << esc << "(s1S" << endl;
if (Pogrubienie)
lpt << esc << "(s3B" << endl;
lpt << esc << "*r3U" << endl; //wybor trybu koloru(Simpe color)
switch (kolor)
{
case 1:
lpt << esc << "*v2S" << endl; //kolor zielony
break;
case 2:
lpt << esc << "*v1S" << endl; //kolor czerwony
break;
case 3:
lpt << esc << "*v12S" << endl; //kolor niebieski
break;
default: //kolor czarny
lpt << esc << "*v0S" << endl;
break;
}
lpt << c << endl; //wydrukowanie tekstu
lpt << esc << "E" << endl; //reset drukarki
lpt.close();
}
void wydruk()
{
fstream lpt;
lpt.open("LPT3", ios::out);
char Y = 0x08,F=0xFF,N=0x00;
lpt << esc << "E" << endl; // Reset printer
lpt << esc << "*r-3U" << endl; // Simple color(3 plane)
lpt << esc << "*r0A" << endl; // Start raster
lpt << esc << "*b1M" << endl; //Compression method
lpt << esc << "*b16V" <<Y<<F <<Y<<F <<Y<<N<<Y<<N <<Y<<N <<Y<<N <<Y <<N <<Y<<N;
lpt << esc << "*b16V" <<Y<<N <<Y<<F <<Y<<N <<Y<<N <<Y<<F <<Y<<F <<Y<<N <<Y<<F;
lpt << esc << "*b16W" <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F <<Y<<F <<Y<<N;
lpt << esc << "*b16V" <<Y<<F <<Y<<N <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F;
lpt << esc << "*b16V" <<Y<<N <<Y<<F <<Y<<N <<Y<<N <<Y<<F <<Y<<F <<Y<<N <<Y<<F;
lpt << esc << "*b16W" <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F <<Y<<F <<Y<<N;
lpt << esc << "*b16V" <<Y<<F <<Y<<N <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F;
lpt << esc << "*b16V" <<Y<<N <<Y<<F <<Y<<N <<Y<<N <<Y<<F <<Y<<F <<Y<<N <<Y<<F;
lpt << esc << "*b16W" <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F <<Y<<F <<Y<<N;
lpt << esc << "*b16V" <<Y<<F <<Y<<N <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F;
lpt << esc << "*b16V" <<Y<<N <<Y<<F <<Y<<N <<Y<<N <<Y<<F <<Y<<F <<Y<<N <<Y<<F;
lpt << esc << "*b16W" <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F <<Y<<F <<Y<<N;
lpt << esc << "*b16V" <<Y<<F <<Y<<N <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F;
lpt << esc << "*b16V" <<Y<<N <<Y<<F <<Y<<N <<Y<<N <<Y<<F <<Y<<F <<Y<<N <<Y<<F;
lpt << esc << "*b16W" <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F <<Y<<F <<Y<<N;
lpt << esc << "*b16V" <<Y<<F <<Y<<N <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F;
lpt << esc << "*b16V" <<Y<<N <<Y<<F <<Y<<N <<Y<<N <<Y<<F <<Y<<F <<Y<<N <<Y<<F;
lpt << esc << "*b16W" <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F <<Y<<F <<Y<<N;
lpt << esc << "*b16V" <<Y<<F <<Y<<N <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F;
lpt << esc << "*b16V" <<Y<<N <<Y<<F <<Y<<N <<Y<<N <<Y<<F <<Y<<F <<Y<<N <<Y<<F;
lpt << esc << "*b16W" <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F <<Y<<F <<Y<<N;
lpt << esc << "*b16V" <<Y<<F <<Y<<N <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F;
lpt << esc << "*b16V" <<Y<<N <<Y<<F <<Y<<N <<Y<<N <<Y<<F <<Y<<F <<Y<<N <<Y<<F;
lpt << esc << "*b16W" <<Y<<N <<Y<<N <<Y<<F <<Y<<N <<Y<<F <<Y<<F <<Y<<F <<Y<<N;
lpt << esc << "*rC" << endl; // End Raster
lpt << esc << "E" << endl; //Reset printer
lpt.close();
}
Kod.h
void wydruk(CString, bool, bool,bool,int, int,int);
void wydruk();
Podsumowanie
Dzięki temu ćwiczeniu mieliśmy okazję zaznajomić się z zasadą działania drukarki atramentowej, a także poznać język PCL, który pozwala na łatwe sterowanie drukarką i przesyłaniem danych do wydruku. Co prawda składnia języka PCL nie należy do najbardziej czytelnych, jednak krótkie komendy z pewnością przyśpieszają proces przesyłania danych z komputera do drukarki.
Bibliografia
http://lprng.sourceforge.net/DISTRIB/RESOURCES/DOCS/Vcs_pcl.pdf
http://www.columbia.edu/~em36/pcltopdf.html
http://support.microsoft.com/kb/131714
http://www.hp.com/ctg/Manual/bpl13210.pdf