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.