UP drukarka atramentowa


Urządzenia peryferyjne
Arek Żuberek
Gwidon Józwiak
Temat: Obsługa drukarki atramentowej.
Grupa: Środa nieparzysta godz 11 15 grupa E
Data: 10 listopad 2010-11-24
1.Wprowadzenie
Celem laboratorium było napisanie programu ,który umożliwiłby nam drukowanie
sformatowanego przez nas tekstu oraz wydrukowanie grafiki na drukarce atramentowej. Aby
możliwa była komunikacja z urządzeniem na port LPT1 musieliśmy wysyłać odpowiednie
ciągi znaków. Ciągi te to komendy w języku PCL odpowiednio dobrane do naszego modelu
drukarki.
2. Przebieg zajęć:
Aby móc rozpocząć przesyłanie jakichkolwiek danych do drukarki musieliśmy zdefiniować
 uchwyt do odpowiedniego urządzenia lub raczej do portu przez który komunikować
mieliśmy się z tym urządzeniem pozwoliła nam na to następująca linijka kodu :
HANDLE port=CreateFile("LPT1" , GENERIC_READ|GENERIC_WRITE , 0 , NULL ,
CREATE_ALWAYS , 0 , NULL);
Powyższa zmienna port miała na celu wskazywanie na port LPT1 tak aby nawiązwć łącznośc
z drukarką. Zdefiniowalismy tez zmienną char buf[256]; która będzie zawierała
calkowity ciąg znków wysyłany na drukarkę (wszystkie formatowania oraz wysyłany tekst).
Następnie aby możliwe było przesyłanie do stworzoneggo uchwytu konieczne było
zastosowanie funkcji sprintf która jako jeden z argumentów przyjmuje zmienną do której ciąg
znaków ma być wysłany , będzie to nasz buf. Zaczęliśmy od polecenia
j=sprintf(buf,"%cE",27); . Do zmiennej j zapisana zostanie po tej linijce kodu liczba
znaków wysłanych na buf . W miejsce %c wstawiany jest znak którego kod znajduje się po
przecinku , 27 to kod znaku Esc od którego zaczyna się każda komenda w języku PCL .
Komenda EscE to komenda resetu drukarki konieczna przed każdorazowym nowym
wydrukiem .Konieczna okazała się również kolejna komenda j+=sprintf(buf+j,"% c&l0H
",27); czyli komenda eject paper. Warto dodać tutaj że jak widać zmienna j służy nam do
wysyłania kolejnych znaków w odpowiednie miejsce tblicy buf , tak abysmy nie nadpisywali
kolejnych komend PCL. Następnie stosujemy linijki kodu różniące się jedynie kodem PCL
poniżej przedstawiamy kilka przykładowych linijek wraz z objasnieniami mówiącymi co tak
naprawde każą one zrobić drukarce.
j+=sprintf(buf+j,"%c&l0O",27); //Ustawienie orientacji strony na pionową
j+=sprintf(buf+j,"%c*r3U",27); //Ustawienie sposobu doboru kolorów na RGB
j+=sprintf(buf+j,"%c*v4S",27); //Ustawienie koloru tekstu na Magenta
j+=sprintf(buf+j,"%c(s9.5V",27); //Ustawienie rozmiaru czcionki na 9.5
j+=sprintf(buf+j,"%c(s0S",27); //Ustawienie stylu na brak efektów
j+=sprintf(buf+j,"%c(s3B",27); //Ustawienie pogrubienia
j+=sprintf(buf+j,"%c(s1S",27); //Ustawienie pochylenia
j+=sprintf(buf+j,"%c&d1D",27); // Ustawienie podkreślenia
Po wybraniu odpowiednich opcji przez użytkownika program wykonywał wybrane linijki z
powyższych po czym następowała linijka j+=sprintf(buf+j,m_text); dodająca do bufora
tekst ze zmiennej m_text który będzie wydrukowany. Kiedy zmienna buf była już gotowa do
wydruku wywoływaliśmy zdefiniowaną przez nas funkcję
bool Print_nasz(HANDLE druk)
{
unsigned long ile;
CString cos=buf;
int dl=strlen(cos);
if(!WriteFile(druk,cos,dl,&ile,NULL))
AfxMessageBox("Blad wydruku");
FlushFileBuffers(druk);
if(strlen(buf)==ile) return TRUE;
else return FALSE;
}
Funkcja ta wywoływała funkcję WriteFile ,która zapisywała do uchwytu druk zawartośc
zmiennej cos bedącej tak naprawdę kopią tego co umieściliśmy w buf . Dodatkowe
argumenty funkcji WriteFile to ilość wysyłanych znaków (rozmiar cos) i ilosc znakow
faktycznie wysłanych (zmienna ile). Funkcja wyswietla komunikat o błędzie przy nieudanym
zapisie sama zwraca też FALSE jeśli nie wysłalismy tylu znaków ile było w zmiennej buf.
Wywołanie tej funkcji z podanym jako argument uchwytem port kończyło się wydrukiem.
Drugą częścią zadania było wyświetlenie grafiki. Tutaj konieczne okazały się inne polecenia
PCL które przedstawiamy poniżej.
j+=sprintf(buf+j,"%c *r0A",27); //Rozpoczęcie drukowania grafiki od lewej
j+=sprintf(buf+j,"%c *t300R",27); //Ustawienie rozdzielczości na 300 dpi
j+=sprintf(buf+j,"%c *b0M",27); //Ustawienie trybu kompresji na 0
j+=sprintf(buf+j,"%c *b80X",27); //Ustawienie przesunięcia o 80 względem osi x
j+=sprintf(buf+j,"%c *b4W",27); //Zainicjowanie przesyłania 4 bajtów grafiki
j+=sprintf(buf+j,"%c *rB",27); //Powrót do trybu tekstowego
Zaczynamy od ustawienia rozdzielczości , trybu komresji na zero co oznacza że posczególne
pixele będą traktowane jak bity przesyłanych danych 1 to czarny 2 biały następnie inicjujemy
przesyłanie dadych. Aby wydrukowac coś w rodzaju kodu kreskowego wywolywalismy
nastepujący kod.
for(int i=0;i<20;i++)
{
j+=sprintf(buf+j,"%c *b1Y",27);
j+=sprintf(buf+j,"%c*r0A",27);
j+=sprintf(buf+j,"%c*b4W",27);
j+=sprintf(buf+j,"m");
j+=sprintf(buf+j,"m");
j+=sprintf(buf+j,"m");
j+=sprintf(buf+j,"m");
}
Wnioski:
Aby skutecznie obsługiwać drukarkę atramentową konieczna jest znajomość języka PCL bez
którego nie da się formatować tekstu czy tez wykonywać operacji resetu. Samo wysyłanie
danych nie jest trudne o ile wiemy na jaki port mamy je przesyłać. Warto pamiętac że jeśli
wyświetlaliśmy grafikę to zawsze należy zastosować poleceni PCL j+=sprintf(buf+j,"%c
*rB",27); które przejdzie spowrotem do trybu tekstowego.


Wyszukiwarka