Kezdőlap › Fórumok › Programozás › LPT port kontrol C++
- This topic has 60 hozzászólás, 3 résztvevő, and was last updated 12 years, 5 months telt el by
script.
-
SzerzőBejegyzés
-
2012-08-02-17:17 #1890391
SziasztokSzeretnek egy C++ programot irni (ha van keszen
2012-08-02-17:46 #2205274Két lehetőséged van 1) használod a GNU C parport elérés függvényeit (konkrétan C++ nem valószínű, hogy van) 2) direkt címeket használsz.A (1) némileg egyszerűbb, emberibb, a (2) viszont sokkal rugalmasabb, mindenen működik és elég egy assembler is hozzá, de csak a nyers számok...Nekem ez az első találat, de jónak tűnik.Akár egy linux parport filet nyitsz meg, akár direkt címen éred el a portot, utána már csak ki kel küldeni az adatokat, aminél tudni kell, hogy mit.
2012-08-02-18:20 #2205275Találtam még egy érdekes és magyar leírást a nyomtatóportról.Amúgy induljunk ki a direkt címzésből:
Code:#includeCode:#define BASEPORT 0x378 // elvileg ez kell nekedCode:ioperm(BASEPORT, 1, 1) // bekapcsolás nem nullával, hiba -1ioperm(BASEPORT, 1, 0) // kikapcsolás nullávalCode:outb(byte, BASEPORT)byte = inb(BASEPORT)Hát nagyjából ennyi az elérés, már csak azt kell tudni mit küldesz ki és mit olvasol be.természetesen man ioperm
2012-08-02-18:25 #2205276Ja, és természetesen jog kell hozzá. Ez utóbbinál, ha minden igaz /dev/parport file-ok sem kellenek, viszont kell az engedély, hogy direkt címezgesd a portokat. Azaz pl. a saját címezgetődnek root.Ellenben az open(“/dev/parport...”,...)-hoz nem feltétlenül, ugyanis jogokat adhatsz a file olvasására vagy írására is.
2012-08-02-21:01 #2205277Ezt olloztam ossze, innen-onnan, egyenlore csak root kent mukodik.Elsore Kikapcsolja aztan 2sec. utan Be kapcsolja az 1-es labat legalabbis a terminal szerint, meg nem probaltam LED -el.
Code:#include #include #include #include #include #define BASEPORT 0x378using namespace std;int main(){if (ioperm(BASEPORT, 1, 1)){perror("ioperm");cout << "Error!" << endl;exit(1);}cout << "Light offn";outb(0, BASEPORT);sleep(2);cout << "Light onn";outb(1, BASEPORT);sleep(2);if (ioperm(BASEPORT, 1, 0)){perror("ioperm");cout << "Error" << endl;exit(1);}exit(0);}2012-08-02-21:13 #2205278Holnap kiprobalom a progit elesben, - Kitolom a "sleep" -et tetszolegesre.- Rakotok egy ~470 Ohm koruli ellenallassal egy LED -et az 1-es lab es a Ground koze.- Ha mukodnek a fentiek akkor minden egyes labhoz irok egy hozzaillo scriptet amit kulon meglehet hivni pl: ./lpt1on.sh ,./lpt1off.sh
2012-08-02-21:20 #2205279Meg valami olyanon agyalok ami kilistazna az eppen aktualis port statuszokat. (hasonlo mint az nmap)Pl;lpt1 ONlpt2 OFF .....Termeszetesen itt a szamok a kivezetesek szamat jelolik.
2012-08-02-21:40 #2205280Nem rootként az ioperm (jog adása) nem fog menni. (De mehet egy root daemonként.)Az open device file, write/read függvények fognak menni (ha a device file írása/olvasása engedélyezett annak a felhasználónak). Gondolom egyébként ott már nem direkt megy, hanem van hozzá valami C struktúrás megoldás (mint az input eventnél, meg ilyeneknél)... passz. Amikor utoljára párhuzamos portot használtam, akkor direkt módon csináltam és leginkább assemblerben.Amúgy azért kellett egy ilyen primitív kódot C++-ben megírni, hogy aztán scripteket írj hozzá? Amúgy semmi közöm hozzá, csak valahogy nem tűnik praktikusnak.Nyilván a C programot parancssorból kiválóan lehet lábakra, de portokra programozni. Nem is beszélve esetleges konfigurációs file-okról, vagy minimum guiról. (Bár az utóbbit, sőt egy bonyolultabb konfigurációt sem biztos, hogy megér, de egy C paraméterlista kezelése sem bonyolultabb, mint egy bash-é. Ha kell, de nem tudod esetleg, akkor inkább kérdezz... a mottónk szerint is szabad. :D)
2012-08-02-21:53 #2205281Nem rootként az ioperm (jog adása) nem fog menni. (De mehet egy root daemonként.)Az open device file, write/read függvények fognak menni (ha a device file írása/olvasása engedélyezett annak a felhasználónak). Gondolom egyébként ott már nem direkt megy, hanem van hozzá valami C struktúrás megoldás (mint az input eventnél, meg ilyeneknél)... passz. Amikor utoljára párhuzamos portot használtam, akkor direkt módon csináltam és leginkább assemblerben.Amúgy azért kellett egy ilyen primitív kódot C++-ben megírni, hogy aztán scripteket írj hozzá? Amúgy semmi közöm hozzá, csak valahogy nem tűnik praktikusnak.Nyilván a C programot parancssorból kiválóan lehet lábakra, de portokra programozni. Nem is beszélve esetleges konfigurációs file-okról, vagy minimum guiról. (Bár az utóbbit, sőt egy bonyolultabb konfigurációt sem biztos, hogy megér, de egy C paraméterlista kezelése sem bonyolultabb, mint egy bash-é. Ha kell, de nem tudod esetleg, akkor inkább kérdezz... a mottónk szerint is szabad. :D)
Mindenbizonnyal igazadvan abban amit fent allitasz, azis valoszinu, hogy nem praktikus a megoldasom, de par hete elhataroztam, hogy C++ -al fogok foglalkozni.Kicsit belefaradtam a szamitastechnikai tudatlansagomba (kicsi bash, kicsit C, kicsit C++) "Jack of all trades master of none" Ezert aztan az osszes eddigi problemamat C++ ban probalom megoldani.Meglehet, hogy 1-2 ev mulva enis mosolyogni fogok azon, hogy mikent oldottam meg dolgokat elozoekben....Koszonom szepen
2012-08-03-20:35 #2205282Szoval ennek a 2 file nak a formajara atirtam mind a 8 kimenetet.Ugynezki, hogy mukodik a dolog root kent.(Meg azis lehet keszitek neki valami grafikus feluletet aztan csak klikkelgetni kell, (de ez majd egy kesobbi project lesz)).
Code:root@machine:/home/script/LPT# chmod 777 -R -v /home/script/LPT/mode of `/home/script/LPT/' changed to 0777 (rwxrwxrwx)mode of `/home/script/LPT/lpt6off.sh' changed to 0777 (rwxrwxrwx)mode of `/home/script/LPT/lpt7off.cpp' changed to 0777 (rwxrwxrwx) s.t.b.Code:script@machine:~/LPT$ ./lpt1on.shioperm: Operation not permittedError!Code:script@machine:~/LPT$ ls -la /dev/parport0crw-rw---- 1 root lp 99, 0 Aug -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz