Wyjaśnienie działanaia programu obsługującego LPT

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
witek23
Sędziwy Jeż
Sędziwy Jeż
Posty: 49
Rejestracja: 31 gru 2008, 11:40
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

Wyjaśnienie działanaia programu obsługującego LPT

Post autor: witek23 »

Witam,

Znalazłem w sieci poniższy program obsługujący port LPT:

Kod: Zaznacz cały

#include <fcntl.h>
#include <unistd.h>
const int CTL_PORT=0x378+2;
const int ON=0x01;
int main()
{
int fd;
unsigned char command=ON;
fd=open("dev/port", O_WRONLY, 0);
lseek(fd, CTL_PORT, SEEK_SET);
write(fd, &command, 1);// zapisujemy na porcie LPT1 na  D0 bit 1
} 
Chciałbym, żeby ktoś wyjaśnił mi poszczególne komendy takie jak: CTL_PORT, SEEK_SET. Rozumiem działanie programu jednak nie rozumiem takiej składni np. nie wiem dlaczego CTL_PORT=0x378+2. To co udało mi się znaleźć to:

fcntl.h - umożliwia wykonywanie manipulacji na deskryptorze otwartego pliku
unistd.h - ?
CTL_PORT - ?
fd - zwykła zmienna, czy część funkcja biblioteki fcntl.h ?
lseek - służy do ustawiania bieżącej pozycji w pliku
O_WRONLY - otwiera plik tylko do zapisu
SEEK_SET - przesunięcie jest ustawiane na offset bajtów
Składnia polecenia fd=open("dev/port", O_WRONLY, 0) - dlaczego na końcu jest "0"?

Najbardziej mnie trapią te funkcje, przey których postawiłem znak zapytania.
Pozdrawiam!
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: Wyjaśnienie działanaia programu obsługującego LPT

Post autor: beluosus »

Na początek poleciłbym kurs c++, a nie od razu brać się za komunikację przez port LPT.
unistd.h - zawiera różne stałe symboliczne i typy, oraz funkcje.
CTL_PORT - zwykła stała. 0x378+2 to adres portu bazowego LPT, a +2 oznacza przesunięcie względem niego tak, aby wskazywał jakiś tam rejestr (control port?).
fd - najzwyklejsza na świecie zmienna typu int którą definiujesz w pierwszej linijce! Nie wiem skąd przyszło Ci do głowy, że to część biblioteki. Później w niej przechowujesz deskryptor pliku.
int open(const char *pathname, int flags, mode_t mode) - w Twoim wypadku ten argument jest ignorowany. Myślę, że można zapisać tę linię bez trzeciego parametru, bo jest to przeciążona funkcja (pierwszy wariant jest z 2 parametrami).

PS To wszystko jest w man'ie... no, chyba oprócz adresu LPT. ;)
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
witek23
Sędziwy Jeż
Sędziwy Jeż
Posty: 49
Rejestracja: 31 gru 2008, 11:40
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

Odp: Wyjaśnienie działanaia programu obsługującego LPT

Post autor: witek23 »

beluosus pisze:Na początek poleciłbym kurs c++, a nie od razu brać się za komunikację przez port LPT.
unistd.h - zawiera różne stałe symboliczne i typy, oraz funkcje.
CTL_PORT - zwykła stała. 0x378+2 to adres portu bazowego LPT, a +2 oznacza przesunięcie względem niego tak, aby wskazywał jakiś tam rejestr (control port?).
fd - najzwyklejsza na świecie zmienna typu int którą definiujesz w pierwszej linijce! Nie wiem skąd przyszło Ci do głowy, że to część biblioteki. Później w niej przechowujesz deskryptor pliku.
int open(const char *pathname, int flags, mode_t mode) - w Twoim wypadku ten argument jest ignorowany. Myślę, że można zapisać tę linię bez trzeciego parametru, bo jest to przeciążona funkcja (pierwszy wariant jest z 2 parametrami).

PS To wszystko jest w man'ie... no, chyba oprócz adresu LPT. ;)
Dzięki za odpowiedz:) Co do c++ to znam podstawy programowania proceduralnego i obiektowego, a w typowych kursach nie ma mowy o programowaniu pod porty... Co miałeś na myśli mówiąc, że wszystko jest w manualu, gdzie mogę go znaleść?
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: Wyjaśnienie działanaia programu obsługującego LPT

Post autor: beluosus »

Kod: Zaznacz cały

man unistd.h
man 2 open
Itd. Do tego google i masz wszystko.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości