Difference between revisions of "Hardware Access/hu"
m |
|||
Line 312: | Line 312: | ||
</delphi> | </delphi> | ||
− | + | A [[Hardware Access/hu#Külső hivatkozások | külső hivatkozások]] részben UNIX és Windows soros port kezeléssel foglalkozó írások címei találhatók. | |
− | |||
It is also worth noting the function of the TBlockSerial.LinuxLock parameter under linux. When set to default of True, a connect will try to create a lock file (eg. "LCK..ttyUSB0") under /var/lock and fail if a lock already exists for the requested port. The lock file will be left over if Free was not called. Setting LinuxLock to False will make Synaser ignore port locking. | It is also worth noting the function of the TBlockSerial.LinuxLock parameter under linux. When set to default of True, a connect will try to create a lock file (eg. "LCK..ttyUSB0") under /var/lock and fail if a lock already exists for the requested port. The lock file will be left over if Free was not called. Setting LinuxLock to False will make Synaser ignore port locking. | ||
Line 344: | Line 343: | ||
===FTDI=== | ===FTDI=== | ||
− | + | Az [http://www.ftdichip.com/ FTDI] chip-jeinek kezeléshez használhatod az általuk kiadott pascal fejléceket a dll függvénytáruk eljárásainak hívására. | |
==Külső hivatkozások== | ==Külső hivatkozások== |
Revision as of 20:39, 2 February 2010
│
Deutsch (de) │
English (en) │
español (es) │
français (fr) │
magyar (hu) │
日本語 (ja) │
한국어 (ko) │
polski (pl) │
português (pt) │
русский (ru) │
slovenčina (sk) │
中文(中国大陆) (zh_CN) │
Hardver hozzáférés
Áttekintés
Ezen az oldalon a hardverek Lazarus által megvalósítható eléréséről olvashatsz. Ezek az eszközök a következők: ISA, PCI, USB, párhuzamos port, soros port, stb.
Egységes több-platformos elérés a hardver eszközökhöz nincs kidolgozva a Free Pascal Runtime Library-ban vagy az LCL-ben. Ezért ez az oldal megpróbálja összefoglalni a hardverek elérésének módjait különböző platformokon. A kód lefordítható különböző környezetekben a feltételes fordítási lehetőséget használva, így:
<delphi>
uses Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, {$IFDEF WIN32} Windows; {$ENDIF} {$IFDEF Unix} ports; {$ENDIF}
</delphi>
Jelenleg nem ismert hogy a Mac OS X/x86 engedi-e a hardverek elérését. Mivel megakadályozhatja, ezért javaslom olyan driver-ek használatát mint az io.dll.
Párhuzamos és Soros kommunikáció összehasonlítása
Az ISA kártyák, a PCI kártyák és a Parallel Port a számítógéppel párhuzamos protokollal kommunikál. A Serial Port és az USB eszközök soros protokolt használnak. Mivel a processzor és így a programozási nyelvek is az adatok elérésének párhuzamos módját alkalmazzák, ezért e protokolok használata jóval egyszerűbb a szoftverekben. Amikor egy Integer típusú változót kezelsz, annak értékét egyetlen utasítással elérheted. A soros protokollal azonban egyszerre csak egy bitet szerezhetsz meg, és ezt követően össze kell fűznöd azokat hogy megismerd a tényleges adatot.
A soros kommunikációt bonyolultabb kidolgozni, de viszonylag egyszerű ha egy előre elkészített komponenst használsz. A hardver oldalán is nehéz a megvalósítás, ezért sok hardver speciális integrált áramköröket vagy mikrokontrollereket tartalmaz erre a célra.
Íme egy összefoglaló táblázat a hardver hozzáférési protokolokról:
Sebesség | Hardver kialakítás nehézsége | |
---|---|---|
Serial Port | Nagyon lassú (< E5 bit/s) | Közepes |
Parallel Port | Lassú (~ E6 bit/s) | Könnyű |
ISA Card | Közepes (~ E7 bit/s) | Közepes |
USB | Közepes (~ E7 bit/s) | Nehéz |
PCI Card | Nagyon gyors (> E9 bit/s) | Nagyon nehéz |
Párhuzamos kommunikáció
Az inpout32.dll használata Windows-on
Windows 9x és NT kiadásaiban különböző módok léteznek a hardverek eléréséhez. A 9x sorozatban (95, 98, ME) a programok közvetlenül hozzáférhetnek a hardverekhez, mint a DOS esetén tehették. Az NT sorozatban (Windows NT és XP) azonban ez nem lehetséges. Ezeken a rendszereken minden kommunikációt a hardverekkel eszközmeghajtókkal kell megvalósítani. Ez biztonsági szempontból jó, de eszköz-meghajtó programokat fejleszteni sok idejébe és pénzébe kerülhet a kis vállalkozásoknak.
Szerencsére van egy függvénytár ami megoldja ezt a problémát. Ha Windows NT rendszert érzékel kicsomagolja a HWInterface.sys kernel szintű eszközmeghajtót és telepíti azt. Ha Windows 9x rendszert érzékel akkor egyszerűen gépi kódú utasításokat használ a hardver eléréséhez.
Hogyan használható a függvénytár? Egyszerűen! Csak két eljárás van: Inp32 és Out32, használatuk pedig magától értetődő.
Dinamikusan lesz betöltve a függvénytár, ezért először definiálni kell mindkét funkciót:
<delphi>
type TInp32 = function(Address: SmallInt): SmallInt; stdcall; TOut32 = procedure(Address: SmallInt; Data: SmallInt); stdcall;
</delphi>
- Address mutatja a port címét amit el akarsz érni
- Out32 elküldi Data tartalmát az Address által mutatott portra
- Inp32 kiolvas egy bájtot az Address által mutatott portról
Most betöltheted a függvénytárat. Ezt megteheted ott ahol a programod főablakának OnCreate metódusát deklarálod:
<delphi>
type TMyForm = class(TForm) ......... private { private declarations } Inpout32: THandle; Inp32: TInp32; Out32: TOut32; ......... implementation ......... procedure TMyForm.FormCreate(Sender: TObject); begin {$IFDEF WIN32} Inpout32 := LoadLibrary('inpout32.dll'); if (Inpout32 <> 0) then begin // needs overtyping, plain Delphi's @Inp32 = GetProc... leads to compile errors Inp32 := TInp32(GetProcAddress(Inpout32, 'Inp32')); if (@Inp32 = nil) then Caption := 'Error'; Out32 := TOut32(GetProcAddress(Inpout32, 'Out32')); if (@Out32 = nil) then Caption := 'Error'; end else Caption := 'Error'; {$ENDIF} end;
</delphi>
Ha a függvénytárat az OnCreate-ben töltöd be akkor ne felejtsd el befejezni a használatát az OnDestroy-ban:
<delphi>
procedure TMyForm.FormDestroy(Sender: TObject); begin {$IFDEF WIN32} FreeLibrary(Inpout32); {$ENDIF} end;
</delphi>
Itt egy egyszerű példa az Inp32 funkció használatára:
<delphi>
{$IFDEF WIN32} myLabel.Caption := IntToStr(Inp32($0220)); {$ENDIF}
</delphi>
Ez a kód egy ISA kártyával lett tesztelve a $0220-as porton, Lazarus 0.9.10 használatával Windows XP rendszeren. Természetesen a Windows unit-nak a uses részben szerepelnie kell hogy futtthasd ezt a kódot. Használatához az "inpout32.dll" állományt ugyanabba a könyvtárba kell telepíteni ahol az alkalmazásod található.
A függvénytár honlapja itt található: www.logix4u.net/inpout32.htm *lásd: discussion*
Assembler használata Windows 9x rendszeren
Windows 9x rendszeren használhatsz assembler kódot is. Tegyük fel hogy a $320-as portra a $CC értéket akarod írni. A következő kód ezt teszi::
<delphi>
{$ASMMODE ATT} ... asm movl $0x320, %edx movb $0xCC, %al outb %al, %dx end ['EAX','EDX'];
</delphi>
Hibaelhárítás Windows-on
Egy léehetséges hibaforrás hogy olyan párhuzamos hardvert használsz amely nem támogatja a "Plug And Play" rendszert Windows-on és így annak portjait a Windows egy másik eszközhöz kapcsolja. A következő hivatkozáson információkat találsz arról hogy miként utasíthatod a Windows-t arra hogy ne használja a hardvered portjait "Plug And Play" eszközökhöz:
http://support.microsoft.com/kb/135168
Folyamatban...