PDA

Tam Sürümünü Görmek İçin : paralel port yazılımı


beautifulriver
19/07/2004, 09:10
Mrblar Ben Paralel Port İle En Basİtten C++ Komutlari İle Led Yuakip SÖndÜrmek İstİyorum Ama Wİn Xp De ÇaliŞirken Program Derlenİp ÇaliŞmaya BaŞladiĞinda Bİr Anada Wİndows Hata Uyarisi Yapiyor Ve Programim Sonlaniyor.İnternette Wİn Xp İle Paralel Port KontrolÜ İle İlgİlİ Çok Az Dokuman Var.İngİlİzce Sİtelerdende AnlaŞilmasi Çok Zor Oluyor.bana Ne YapacaĞima Daİr b Bu Konuda Yardimci Olursaniz Sevİnİrİm.


psikopat®
19/07/2004, 13:05
http://www.darkhardware.com/phpbb/viewtopic.php?t=56695
http://www.darkhardware.com/phpbb/viewtopic.php?t=56388

yukarda paralel port ile ilgili bilgi var. biraz incele istersen. soracağın birşey olursa bildiğim kadarıyla cevaplamaya çalışırım....

ibrahim
19/07/2004, 13:25
c++ ile paralel porta nasıl bilgi gönderebilirim ve c++ ile assembly kullanımı ile ilgili geniş bilgi gönderebilirmisiniz

Euclides
19/07/2004, 13:31
1.Yöntem
http://www.logix4u.net/inpout32.htm
bu dll'ti indirip kullanabilirsin içinde vb,c++ ile kullanımını gösteren örneklerde var.
Fakat aslında bu bir dll değil bir sys yani kullanıcının bunu çalıştırabilmesi için admin olması gerekiyor.
BU led yakıp söndürmek içi iyi bir yöntem.
================================================== =====
2.Yöntem
Ama sadece WinXP için belden aşağı bir vuruşda yapabilirsin. :) :)
Böylece hiçbir dll sys kullanman gerekmez
(yani ms bir gün SPx çıkartması ve bunun çalışmaması mümükün)
programımızda önce FixToken() çağırıyoruz(sadece 1KEZ )
sonra xOut ile istediğimizi yapıyoruz.

typedef struct _IO_STRUCT_OP{
DWORD low_io_addr;
DWORD high_io_addr;
DWORD user_addr;
DWORD len;
DWORD reserved0;
DWORD reserved1;
DWORD reserved2;
DWORD unused;
}IO_STRUCT_OP;
void FixToken()
{
TOKEN_PRIVILEGES tp;
LUID luid;
HANDLE hToken;
TOKEN_PRIVILEGES tpPrevious;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_ PRIVILEGES|TOKEN_QUERY,&hToken);
LookupPrivilegeValue(NULL,"SeDebugPrivilege",&luid));
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken,FALSE,&tp,0,NULL,NULL);
}
void xOut(dword port,dowr data)
{
IO_STRUCT_OP iop;
iop.low_io_addr=(DWORD)LOWORD(port);
iop.high_io_addr=0;
iop.user_addr=(DWORD)&data;
iop.len=1;
iop.reserved0=1;
iop.reserved1=0;
iop.reserved2=1;
iop.unused=0;
ZwSystemDebugControl(15,&iop,sizeof(iop),0,0,0);
}


Fakat hem 1. dll hemde 2. yöntem veri akışı için çoooooook yavaştırlar . Sadece Led yakıp söndürmek için kullanılabilirler.

Darkstar
25/07/2004, 23:15
Paralel port'tan led yakmak olayı güzel de pararlel porta ledi nasıl bağlıycaksınız merak ettim?

psikopat®
26/07/2004, 11:21
outportb komutu ile 0x378 (LPT1 için 0x378 LPT2 için 0x278, ama kullanmadan önce aygıt yöneticisinden bu adresleri kontrol etseniz iyi olur) adresine istediğin sayısı gönderiyosun.

mesela outporb(0x378, 0x8A) dersen

(Hexadecimal)8A= (Binary)01001001

olduğuna göre paralel portun data bus'ına 0 lar 0 V, 1'ler ise 5 V olarak gönderilecektir.

http://members.lycos.co.uk/orkinospdf/p3/lpt_1.gif

data bus'ın nere olduğuna da yukardaki şekilden görebilirsin.

böylece 5 volt gelen pinlerin ucuna seri olarak led ve direnç bağlar ve topraklarsan ledler yanacaktır.

Euclides
26/07/2004, 12:55
@psikopat®:
yukarıda uzun uzun kod vermemin nedeni "outportb" çalışmaması yüzündendi....

psikopat®
26/07/2004, 21:33
@Darkstar

ekteki resimdeki gibi bir bağlantı yaparsan olur. 18-25 arası devrenin toprağı olacak yani.



@Euclides

outportb niçin ve nerde çalışmasın? ben yaptım çalıştı da onun için soruyorum.

Darkstar
26/07/2004, 21:55
Selamlar,

Konu ilgimi çekti ve evdeki laptop'umda denemeye başladım hemen. http://www.logix4u.net/inpout32.htm sitesinde verilen kodları (aşağıda) Borland C++ builder'da bir güzel derledim ve "Inpout32.dll" yi de kopyaladım. Derleyici hatasız derledi ama bir türlü portlara yazdıramadı.. Aşağıda örnek kod (oldukça sade ve güzel bence). Kodun çalışmamasının nedeni dll'in PC için yazılmış olması laptop'a uymaması olabilirmi?

/**************************************************/
/*** ***/
/*** TEST.c -- test interface to inpout32.dll ***/
/*** ( http://www.logix4u.net/inpout32.htm ) ***/
/*** ***/
/*** Copyright (C) 2003, Douglas Beattie Jr. ***/
/*** ***/
/*** <beattidp@ieee.org> ***/
/*** http://www.hytherion.com/beattidp/ ***/
/*** ***/
/**************************************************/


/************************************************** *****/
/* */
/* Builds with Borland's Command-line C Compiler */
/* (free for public download from Borland.com, at */
/* http://www.borland.com/bcppbuilder/freecompiler ) */
/* */
/* Compile with: */
/* */
/* BCC32 -IC:\BORLAND\BCC55\INCLUDE TEST.C */
/* */
/* */
/* Be sure to change the Port addresses */
/* accordingly if your LPT port is addressed */
/* elsewhere. */
/* */
/************************************************** *****/




#include <stdio.h>
#include <conio.h>
#include <windows.h>


/* Definitions in the build of inpout32.dll are: */
/* short _stdcall Inp32(short PortAddress); */
/* void _stdcall Out32(short PortAddress, short data); */


/* prototype (function typedef) for DLL function Inp32: */

typedef short _stdcall (*inpfuncPtr)(short portaddr);
typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);

int main(void)
{
HINSTANCE hLib;
inpfuncPtr inp32;
oupfuncPtr oup32;

short x;
int i;

/* Load the library */
hLib = LoadLibrary("inpout32.dll");

if (hLib == NULL) {
printf("LoadLibrary Failed.\n");
return -1;
}

/* get the address of the function */

inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32");

if (inp32 == NULL) {
printf("GetProcAddress for Inp32 Failed.\n");
return -1;
}


oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32");

if (oup32 == NULL) {
printf("GetProcAddress for Oup32 Failed.\n");
return -1;
}


/************************************************** *************/
/* now test the functions */

/* Try to read 0x378..0x37F, LPT1: */

for (i=0x378; (i<0x380); i++) {

x = (inp32)(i);

printf("port read (%04X)= %04X\n",i,x);
}



/***** Write the data register */

i=0x378;
x=0x77;

(oup32)(i,x);

printf("port write to 0x%X, datum=0x%2X\n" ,i ,x);

/***** And read back to verify */
x = (inp32)(i);
printf("port read (%04X)= %04X\n",i,x);



/***** One more time, different value */

i=0x378;
x=0xAA;

(oup32)(i,x);

printf("port write to 0x%X, datum=0x%2X\n" ,i ,x);

/***** And read back to verify */
x = (inp32)(i);
printf("port read (%04X)= %04X\n",i,x);




FreeLibrary(hLib);
return 0;
}

psikopat®
26/07/2004, 22:20
Windows 95'de Turbo C ile yapmıştık programı ve gayet güzel çalışıyodu.



#include <stdio.h>
#include <dos.h>

main()
{

int n;

printf("Bir sayı girin: ");
scanf("%d",&n);

outportb(0x378, n);

return 0;
}



en basitinden şunu dene bi çalışacak mı bakalım.

ndemir
26/07/2004, 22:30
linux altında denemek isterseniz outb ve inb fonksiyonlarını kullanmalısınız.

Euclides
27/07/2004, 22:02
outportb niçin ve nerde çalışmasın? ben yaptım çalıştı da onun için soruyorum.
Win2k,XP,2k3 ve linux 'ün dünyasına hoşgeldin psikopat
C++'ın kendi outxxx ve inxxxx komutlarını kullanamazsın
ya driver yazcaksın ya bir pislik yapacaksın yada bir başkasının yazdığı driveri kullanacaksın(Inpout32.dll gibi aslın bu dll 2 parca 1 driver 1 dll)

Win9x sistemlerinde pek ring-0 ring-3 ayrımı yok :) her isteyen istediğini yapıyor.
Ama yeni nesil windows'larda normal olarak var.
Öyle her önüne gelen i/o yapamaz. I/o yapabilmek için Ring-0'a geçmeli veya Windows'un senin uygulama özel izin atamasını sağlamalısın.


Assembly'a giriş dersinde uzun uzun bu olayı sebeb ve sonuçlarını anlattım.
Aşağıda örnek kod (oldukça sade ve güzel bence). Kodun çalışmamasının nedeni dll'in PC için yazılmış olması laptop'a uymaması olabilirmi?
normaldir çünkü parallet portu 378h ile gösterilecek diye bir olay yok.
Önce parelel porunun adresini öğrenmelisin.
ör: benim pc'im biosu(award) paralel portun adresinin değiştirmeme izin veriyor...

Darkstar
27/07/2004, 22:47
Tekrar selamlar,

Borland C++ için yularda yazılan program çalışmadı ama http://www.logix4u.net/inpout32.htm adresinden buldugum örnek program visual C++ derleyicisi ile derledikten sonra çok güzel bir şekilde çalıştı. Paralel porta bağladıgım ledleri de kontrol etmeyi başardım :)

beautifulriver
29/07/2004, 14:15
arkadaşlar.birinci olaral ledleri bilgisayarın arkasındaki printer girişine bağlayacağız .bunun için kitaplarda ve internette epey bilgi var.ama asıl szor olan bunun programlanması.bu konu ile ilgili epey araştırma yaptım ama bulduğum bilgiler yetersiz geldi.win xp de sorun bitmiyor.arkadaşın birinin yazdığı program sadece windows 98 de çalışıyor ama benim istediğim ise win xp.bunun için www.logic4x.com a baktım orada istenilenleri yaptım am aolmadı. acaba yanlış yaptığım bir şeylermi var.lütfen bana bu konuda yardımcı olun bunu öğrenebilirsek çoğu kişi içinde faydalı olur direk açık kaynak olarak internete veririz.zaten türkçe kaynak yok internette.arkadaşlar yardımınızı bekliyorum tekrar teşekkürler

Euclides
29/07/2004, 18:25
programını admin olarak çalıştırıyorsun değil mi ?
çünkü KMD'leri sadece adminler yükleyebilir

KamilORS
28/02/2007, 03:58
windows xp de çalışmıyor yukardaki program çünkü nt tabanlı sistemlerede port kullanımı engellenmiş durumda. bu durumu çözmek için arkadaşların dediği inpout32.dll dosyasını kullanmamız şart. Bunu Turbo C ile nasıl yapıcaz işte onu bende bilmiyorum :)