Difference between revisions of "Hardware Access/hu"

From Lazarus wiki
Jump to navigationJump to search
m
m (Fixed syntax highlighting)
 
(25 intermediate revisions by 6 users not shown)
Line 1: Line 1:
 
{{Hardware Access}}  
 
{{Hardware Access}}  
  
+
= Hardver hozzáférés =
<font size="7">Hardver hozzáférés</font>
 
 
 
   
 
   
 
__TOC__
 
__TOC__
 +
 
==Áttekinté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.
 
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:
 
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>
+
<syntaxhighlight lang=pascal>
 
  uses
 
  uses
 
   Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
 
   Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Line 20: Line 20:
 
   ports;
 
   ports;
 
  {$ENDIF}
 
  {$ENDIF}
</delphi>
+
</syntaxhighlight>
  
  
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.
+
Jelenleg nem ismert hogy a macOS/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==
 
==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 az adatok megközelítésének párhuzamos módját alkalmazzák, ezért e protokolok használata jóval egyszerűbb a szoftverekben. Amikor egy Integer tipusú 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.
+
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.
 
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.
Line 32: Line 32:
 
Íme egy összefoglaló táblázat a hardver hozzáférési protokolokról:
 
Íme egy összefoglaló táblázat a hardver hozzáférési protokolokról:
  
{| border=2 width="100%"
+
{| class="wikitable" width="100%"
  
 
|-
 
|-
Line 67: Line 67:
 
|}
 
|}
  
Folyamatban...
 
<!--
 
 
==Párhuzamos kommunikáció==
 
==Párhuzamos kommunikáció==
  
 
===Az inpout32.dll használata Windows-on===
 
===Az inpout32.dll használata Windows-on===
Windows has different ways to access hardware devices on the 9x series and on the NT series. On the 9x series (95, 98, Me) programs can access the hardware directly, just like they did on DOS. The NT series (Windows NT and XP), however, don't allow this approach. On this architecture, all communication with hardware ports must be throught a device driver. This is a security mechanism, but developing a driver can cost too much in terms of time and money for small projects.
+
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.
  
Happily there is a library that solves this problem. If Windows NT is detected, it decompresses HWInterface.sys kernel device driver and installs it. If Windows 9x is detected, it simply uses assembler opcodes to access the hardware.
+
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.
  
But how do I use the library? Simple! It has only two functions, Inp32 and Out32, and their use is quite intuitive.
+
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ő.
  
We will load the library dynamically, so let's define both functions first:
+
Dinamikusan lesz betöltve a függvénytár, ezért először definiálni kell mindkét funkciót:
  
<delphi>
+
<syntaxhighlight lang=pascal>
 
  type
 
  type
 
   TInp32 = function(Address: SmallInt): SmallInt; stdcall;
 
   TInp32 = function(Address: SmallInt): SmallInt; stdcall;
 
   TOut32 = procedure(Address: SmallInt; Data: SmallInt); stdcall;
 
   TOut32 = procedure(Address: SmallInt; Data: SmallInt); stdcall;
</delphi>
+
</syntaxhighlight>
  
* Address represents the address of the port you desire to access
+
* Address mutatja a port címét amit el akarsz érni
* Out32 sends Data to the port you specify by Address
+
* Out32 elküldi Data tartalmát az Address által mutatott portra
* Inp32 returns a byte from the port you specify by Address
+
* Inp32 kiolvas egy bájtot az Address által mutatott portról
  
Now we can load the library. This can be implemented in a place like the OnCreate method of your program's main form:
+
Most betöltheted a függvénytárat. Ezt megteheted ott ahol a programod főablakának OnCreate metódusát deklarálod:
  
<delphi>
+
<syntaxhighlight lang=pascal>
 
  type
 
  type
 
   TMyForm = class(TForm)
 
   TMyForm = class(TForm)
Line 119: Line 117:
 
  {$ENDIF}
 
  {$ENDIF}
 
  end;
 
  end;
</delphi>
+
</syntaxhighlight>
  
If you load the library on OnCreate just don't forget to unload it in OnDestroy:
+
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>
+
<syntaxhighlight lang=pascal>
 
  procedure TMyForm.FormDestroy(Sender: TObject);
 
  procedure TMyForm.FormDestroy(Sender: TObject);
 
  begin
 
  begin
Line 130: Line 128:
 
  {$ENDIF}
 
  {$ENDIF}
 
  end;
 
  end;
</delphi>
+
</syntaxhighlight>
  
Here is a simple example of how to use Inp32 function:
+
Itt egy egyszerű példa az Inp32 funkció használatára:
  
<delphi>
+
<syntaxhighlight lang=pascal>
 
  {$IFDEF WIN32}
 
  {$IFDEF WIN32}
 
   myLabel.Caption := IntToStr(Inp32($0220));
 
   myLabel.Caption := IntToStr(Inp32($0220));
 
  {$ENDIF}
 
  {$ENDIF}
</delphi>
+
</syntaxhighlight>
  
This code was tested with a custom ISA card on port $0220, using Lazarus 0.9.10 on Windows XP. Of course you will need to have Windows on your uses clause in order for this code to run. For deployment you only need to include "inpout32.dll" in the same directory of our application.
+
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ó.
  
This is the homepage for the library: [http://www.logix4u.net/inpout32.htm www.logix4u.net/inpout32.htm]  *see discussion*
+
A függvénytár honlapja itt található: [http://www.logix4u.net/inpout32.htm www.logix4u.net/inpout32.htm]  *lásd: discussion*
  
===Using assembler on Windows 9x===
+
===Assembler használata Windows 9x rendszeren===
  
On Windows 9x you can also use assembler code. Suppose you wish to write $CC to the $320 port. The following code will do it:
+
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>
+
<syntaxhighlight lang=pascal>
 
  {$ASMMODE ATT}
 
  {$ASMMODE ATT}
 
  ...
 
  ...
Line 156: Line 154:
 
         outb %al, %dx
 
         outb %al, %dx
 
     end ['EAX','EDX'];
 
     end ['EAX','EDX'];
</delphi>
+
</syntaxhighlight>
  
===Troubleshooting on Windows===
+
===Hibaelhárítás Windows-on===
  
One possible source of trouble using parallel hardware that does not support Plug And Play on Windows is that Windows may assign the port utilized by your hardware to another device. You can find instructions on the URL below about how to tell Windows not to assign the address of your device to Plug And Play devices:
+
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
 
http://support.microsoft.com/kb/135168
  
===Using ioperm to access ports on Linux===
+
Folyamatban...
 +
 
 +
===Az IOPerm használata portok eléréséhez Linuxon===
  
The best way to access the hardware on Linux is through device drivers, but, due to the complexity of the task of creating a driver, sometimes a quick method is very useful.
+
A hardverek elérésének legjobb módja Linux-on az eszközmeghajtók használata, azonban a meghajtókészítés folyamatának bonyolultsága miatt néha egy gyorsabb megoldás kézenfekvőbb.
 +
Ahhoz hogy a "[[doc:rtl/ports|ports]]" unit-ot használhasd Linux-on a programodat rendszergazdaként kell futtatni, és az IOPerm segítségével a port eléréséhez megfelelő jogosultságokat kell beállítani.. A "[[doc:rtl/ports|ports]]" unit dokumentációját [http://www.freepascal.org/docs-html/rtl/ports/index.html itt] találod.
  
In order to use the "[[doc:rtl/ports|ports]]" unit under Linux your program must be run as root, and IOPerm must be called to set appropriate permissions on the port access. You can find documentation about the "[[doc:rtl/ports|ports]]" unit [http://www.freepascal.org/docs-html/rtl/ports/index.html here].
+
Az első teendő a Libc linkelése és azIOPerm meghívása. Van egy unit a free pascalban ami linkeli a meglévő (g) libc-t, azonban ez hibát okoz ha közvetlenül hívjuk meg az alkalmazásból és statikusan kerül felhasználásra, mivel a verziók közötti változások kompatibilitási problémákat okozhatnak. A függvények mint az ioperm valószínűleg nem változnak.  
  
The first thing to do is link to (g)libc and call IOPerm. A unit that links to the entire (g)libc exists on free pascal, but this unit gives problems when used directly by application and linking statically to the entire (g)libc library is not a very good idea because it changes often between version in an incompatible manner. Functions like ioperm, however, are unlikely to change.
 
  
<delphi>
+
<syntaxhighlight lang=pascal>
 
  {$IFDEF Linux}
 
  {$IFDEF Linux}
 
  function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
 
  function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
 
  {$ENDIF}
 
  {$ENDIF}
</delphi>
+
</syntaxhighlight>
  
* "from" represents the first port to be accessed.
+
* "from" az első port amelyet el akarsz érni.
* "num" is the number of ports after the first to be accessed, so ioperm($220, 8, 1) will give access for the program for all ports between and including $220 and $227.
+
* "num" a portok száma az elsőtől amelyeket el akarsz érni, az IOPerm($220, 8, 1) hozzáférést biztosít a program számára az összes porthoz beleértve a $220 és $227 portokat is.
  
After linking to IOPerm you can port[<Address>] to access the ports.
+
Az IOPerm meghívása után a port[<cím>] forma használható.
  
<delphi>
+
<syntaxhighlight lang=pascal>
 
  {$IFDEF Linux}
 
  {$IFDEF Linux}
 
   i := ioperm($220, 8, 1);
 
   i := ioperm($220, 8, 1);
Line 191: Line 191:
 
   myOtherLabel.Caption := 'response: ' + IntToStr(i);
 
   myOtherLabel.Caption := 'response: ' + IntToStr(i);
 
  {$ENDIF}
 
  {$ENDIF}
</delphi>
+
</syntaxhighlight>
  
This code was tested with a custom ISA card on port $0220, using Lazarus 0.9.10 on Mandriva Linux 2005 and Damn Small Linux 1.5
+
Ez a kód egy általános ISA kártya $0220-as portján lett kipróbálva, a Lazarus 0.9.10 változatával Mandriva Linux 2005 és Damn Small Linux 1.5 rendszereken.
  
===General UNIX Hardware Access===
+
===Általános UNIX Hardver Elérés===
  
<delphi>{$IFDEF Unix}
+
<syntaxhighlight lang=pascal>{$IFDEF Unix}
Uses Clib;  // retrieve libc library name.
+
Uses Clib;  // kinyeri a libc könyvtár nevét
 
{$ENDIF}
 
{$ENDIF}
  
 
{$IFDEF Unix}
 
{$IFDEF Unix}
 
function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external clib;
 
function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external clib;
{$ENDIF}</delphi>
+
{$ENDIF}</syntaxhighlight>
  
  
'''Note''' that FPC provides an abstraction for ioperm called "fpioperm" in [[doc:rtl/x86/index.html|unit x86]], and also defines fpIOPL and out-/inport functions. These functions are currently implemented for Linux/x86 and FreeBSD/x86.
+
Az FPC egy absztrakt hívással az "fpioperm" -el éri el az ioperm-t ez a
 +
[[doc:rtl/x86/index.html|x86 unit]]-ban található, és szintén definiálja az  fpIOPL-t és az out-/inport függvényeket. Ezek a függvények állnak rendelkezésre jelenleg a  Linux/x86 és a FreeBSD/x86 rendszerben.
  
It is not recommended to link to libc unless absolutely necessary due to possible deployment and portability functions.
+
Ennek a linkelése nem ajánlott a libc-hez csak ha a telepítés és a hordozhatóság megvalósítható.
Also manual linking to libc (by declaring ad hoc libc imports for functions that are available elsewhere) like done above is not recommended  (e.g. the above libc import line will unnecessarily fail if the standard C lib is not called libc, like e.g. libroot on BeOS, or on platforms with a non standard C symbol mangling).
 
  
'''Note 2''' Using '''unit''' libc is not recommended under any circumstances other than Kylix compatibility. See [[libc unit]]
+
A libc kézi linkelése (pl a libc függvényeinek ad-hoc deklarásával amelyek valahol fellelhetőek) szintén kerülendő (illetve a libc import sor szükségszerűen hibát dob, mivel a standard C lib nem hívja meg a libc-t, továbbá pl. a libroot a BEos vagy más platformokon nem szabványos C szimbólumokat használ). Egyszóval kompatibilitási hibákat okoz.
  
==Serial Communication==
+
'''Megjegyzés:''' A libc unit használata semmilyen körülmények között nem ajánlott, kivétel a Kylix kompatibilitás. Lásd: [[libc unit]]
  
It is very easy to build a serial communication software using the [http://synapse.ararat.cz/doku.php Synaser library]. The example when used together with the [http://synapse.ararat.cz/doc/help/synaser.html Synaser documentation] should be trivial to understand. The most important part is TBlockSerial.Config to configure the speed (in bits per second), data bits, parity bits, stop bits and handshake protocol, if any. The following code was tested with a serial mouse connected to COM 1.
+
==Soros kommunikáció==
  
<delphi>
+
Soros kommunikációt végző szoftver építése nagyon egyszerű a [http://synapse.ararat.cz/doku.php Synaser függvénytár] használatával. A példa együtt áttekintve a [http://synapse.ararat.cz/doc/help/synaser.html Synaser dokumentációjával] könnyen érthető. A leglényegesebb rész a TBlockSerial.Config mellyel beállítható a sebesség (bitek száma másodpercenként), valamint az adat bitek, az ellenörző (parity) bitek, vezérlő (stop) bitek és kapcsolódási (handshake) protokol, ha van. A következő kód egy COM 1-re sorosan csatlakozó egérrel lett tesztelve.
 +
 
 +
<syntaxhighlight lang=pascal>
 
program comm;
 
program comm;
  
Line 238: Line 240:
 
   end;
 
   end;
 
end.
 
end.
</delphi>
+
</syntaxhighlight>
  
The following code-example is an alternative version of the example above. The example above seems to have a critically fault in its main concept, to be exactly, it is the part with "while true do...". On the Test - System (Asus A6T Laptop with Digitus USB to RS232 Adapter, Ubuntu 8.04.1), this part caused the following error: The application ran only one time successfully per session, when the application was started again, the application was unable to connect to the serial port. Thus, a reboot was necessary everytime the user tried to relaunch the application, which is/was a really annoying bug.
 
  
 +
A következő kód a fentebbi példa egy másik változata. A fentebbi példa alapvetően hibásnak tűnik a "while true do..." ciklus használata miatt.
 +
A teszteléshez használt rendszeren (Asus A6T Laptop, Digitus USB-RS232 Adapterrel, Ubuntu 8.04.1), ez a rész a következő hibát okozta: Az alkalmazás munkamenetenként csak egyszer futott hibátlanul, amikor az alkalmazás újra lett indítva, már nem tudott csatlakozni a soros porthoz. Így a rendszer újraindítására volt szükség minden alkalommal amikor a felhasználó az alkalmazást újra használni akarta, ez pedig nagyon zavaró hiba.
 +
<!--
 
The reason is not difficult to understand: The application is in the while true do - loop, which is, to be more precisely, an endless loop. There is no abort-condition, so the only way to close the application is to close the terminal or to press CTRL-C. But if you quit the application this way, the important part with "ser.free", which frees the serial port, will never be called. This problem is described in the following thread in the German Lazarus-Forum [http://www.lazarusforum.de/viewtopic.php?f=10&t=2082 http://www.lazarusforum.de/viewtopic.php?f=10&t=2082]
 
The reason is not difficult to understand: The application is in the while true do - loop, which is, to be more precisely, an endless loop. There is no abort-condition, so the only way to close the application is to close the terminal or to press CTRL-C. But if you quit the application this way, the important part with "ser.free", which frees the serial port, will never be called. This problem is described in the following thread in the German Lazarus-Forum [http://www.lazarusforum.de/viewtopic.php?f=10&t=2082 http://www.lazarusforum.de/viewtopic.php?f=10&t=2082]
  
 
There is a bit code around the main application to make every user clear, not to press CTRL-C. If anyone is worrying, why /dev/ttyUSB0 is used for com-port: this is due to the USB to Serial Adapter (from Digitus) on the test-system. If you have an built-in serial port, please use the 'Com0' - declaration like in the code - example above.  
 
There is a bit code around the main application to make every user clear, not to press CTRL-C. If anyone is worrying, why /dev/ttyUSB0 is used for com-port: this is due to the USB to Serial Adapter (from Digitus) on the test-system. If you have an built-in serial port, please use the 'Com0' - declaration like in the code - example above.  
 
+
-->
<delphi>
+
<syntaxhighlight lang=pascal>
  
 
program serialtest;
 
program serialtest;
Line 257: Line 261:
 
   {$ENDIF}{$ENDIF}
 
   {$ENDIF}{$ENDIF}
 
   Classes,SysUtils,Synaser,Crt
 
   Classes,SysUtils,Synaser,Crt
   { you can add units after this };
+
   { ez után jöhetnek a unit-ok };
  
 
   var l:boolean;
 
   var l:boolean;
Line 264: Line 268:
 
   var k:string;
 
   var k:string;
 
   begin
 
   begin
       Writeln('To quit the application please do NOT use CTRL-C! Instead, please press any key to quit the application! '+
+
       Writeln('A kilépéshez NE használd a CTRL-C gombokat, inkább valamelyik másik gombbal állítsd le az alkalmazást! '+
       'Please confirm this notification before the application continues! '+
+
       'Válassz a lehetőségek közül! '+
       '[0]=Quit, [1]=Confirm, please continue! ');
+
       '[0]=Kilépés, [1]=Rendben, folytatás! ');
       Writeln('Your decision: ');
+
       Writeln('Választás: ');
 
       Read(k);
 
       Read(k);
 
       if StrtoInt(k) = 1 then
 
       if StrtoInt(k) = 1 then
 
       begin
 
       begin
 
             check_affirmation:=true;
 
             check_affirmation:=true;
             Writeln('OK, application continues ...');
+
             Writeln('OK, az alkalmazás tovább fut ...');
 
       end
 
       end
 
       else
 
       else
 
       begin
 
       begin
 
             check_affirmation:=false;
 
             check_affirmation:=false;
             Writeln('Abort');
+
             Writeln('Kilépés');
 
       end
 
       end
 
   end;
 
   end;
Line 290: Line 294:
 
           Sleep(1000);
 
           Sleep(1000);
 
           ser.config(1200, 7, 'N', SB1, False, False);
 
           ser.config(1200, 7, 'N', SB1, False, False);
           Write('Device: ' + ser.Device + '  Status: ' + ser.LastErrorDesc +' '+
+
           Write('Eszköz: ' + ser.Device + '  Állapot: ' + ser.LastErrorDesc +' '+
 
           Inttostr(ser.LastError));
 
           Inttostr(ser.LastError));
 
           Sleep(1000);
 
           Sleep(1000);
Line 297: Line 301:
 
           until keypressed; //Important!!!
 
           until keypressed; //Important!!!
 
       finally
 
       finally
               Writeln('Serial Port will be freed...');
+
               Writeln('A soros port fel lesz szabadítva...');
 
               ser.free;
 
               ser.free;
               Writeln('Serial Port was freed successfully!');
+
               Writeln('A soros port sikeresen fel lett szabadítva!');
 
       end;
 
       end;
 
   end;
 
   end;
Line 308: Line 312:
 
     RS232_connect()
 
     RS232_connect()
 
     else
 
     else
     Writeln('Program quit! ');
+
     Writeln('Kilépés a programból! ');
 
   end.
 
   end.
  
</delphi>
+
</syntaxhighlight>
 
 
Also, the [[Hardware Access#External Links | External Links]] section has UNIX and Windows serial port tutorials.
 
 
 
  
 +
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 323: Line 326:
  
 
Another very simple fpc Serial unit is now part of freepascal (at least in version 2.2.2), just put Serial in your Uses list however there does not seem to be any documentation other than the Serial.pp source file.
 
Another very simple fpc Serial unit is now part of freepascal (at least in version 2.2.2), just put Serial in your Uses list however there does not seem to be any documentation other than the Serial.pp source file.
 
+
-->
 
==USB==
 
==USB==
  
 
===libusb===
 
===libusb===
  
A cross platform possibility for Linux, BSDs and Mac OS X is [http://libusb.sourceforge.net/ libusb].
+
Egy keresztplatformos lehetőség Linux, BSD és macOS rendszerekhez a [http://libusb.sourceforge.net/ libusb].
  
Headers are listed in http://www.freepascal.org/contrib/db.php3?category=Miscellaneous:
+
A fejlécek megtalálhatók a http://www.freepascal.org/contrib/db.php3?category=Miscellaneous címen:
  
 
{|cellpadding="4"
 
{|cellpadding="4"
 
|-
 
|-
! name !! author !! version !! date !! link !! remarks
+
! név !! szerző !! változat !! dátum !! link !! megjegyzés
 
|-
 
|-
 
| libusb.pp || nowrap | Uwe Zimmermann || 0.1.12 || nowrap | 2006-06-29 || http://www.sciencetronics.com/download/fpc_libusb.tgz ||  
 
| libusb.pp || nowrap | Uwe Zimmermann || 0.1.12 || nowrap | 2006-06-29 || http://www.sciencetronics.com/download/fpc_libusb.tgz ||  
Line 340: Line 343:
 
| libusb.pas || Johann Glaser ||  || nowrap | 2005-01-14 || http://www.johann-glaser.at/projects/libusb.pas ||  
 
| libusb.pas || Johann Glaser ||  || nowrap | 2005-01-14 || http://www.johann-glaser.at/projects/libusb.pas ||  
 
|-
 
|-
| fpcusb || Joe Jared || 0.11-14 || nowrap | 2006-02-02 || http://relays.osirusoft.com/fpcusb.tgz || nowrap | download link broken
+
| fpcusb || Joe Jared || 0.11-14 || nowrap | 2006-02-02 || http://relays.osirusoft.com/fpcusb.tgz || nowrap | hibás letöltési cím
 
|}
 
|}
  
 
===FTDI===
 
===FTDI===
  
If you use one of the chips from [http://www.ftdichip.com/ FTDI], you can use their pascal headers for their dll interface to the chips.
+
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.
  
==External Links==
+
==Külső hivatkozások==
  
Communication Protocols speed comparison:
+
Kommunikációs Protokolok sebességének összehasonlítása:
  
 
# http://en.wikipedia.org/wiki/Serial_port#Speed
 
# http://en.wikipedia.org/wiki/Serial_port#Speed
Line 356: Line 359:
 
# http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications
 
# http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications
  
Serial Communication Links:
+
Soros Kommunikációval kapcsolatos hivatkozások:
  
# On UNIX: [http://www.easysw.com/~mike/serial/serial.html]
+
# UNIX-on: [http://www.easysw.com/~mike/serial/serial.html]
# On Windows: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp
+
# Windows-on: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp
# Synaser component: http://synapse.ararat.cz/
+
# Synaser komponens: http://synapse.ararat.cz/
# Comport Delphi package: http://sourceforge.net/projects/comport/
+
# Comport Delphi csomag: http://sourceforge.net/projects/comport/
  
ISA Digital Oscilloscope - A example of hardware access with full source included:
+
ISA Digital Oscilloscope - Egy példa a hardverelérésre teljes forráskóddal:
 
+
[http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/ http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/]
[http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/]
 
  
 +
<!--
 
----
 
----
 
[[Networking]]
 
[[Networking]]
 
-->
 
-->

Latest revision as of 12:20, 16 February 2020

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:

 uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
 {$IFDEF WIN32}
   Windows;
 {$ENDIF}
 {$IFDEF Unix}
   ports;
 {$ENDIF}


Jelenleg nem ismert hogy a macOS/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:

 type
   TInp32 = function(Address: SmallInt): SmallInt; stdcall;
   TOut32 = procedure(Address: SmallInt; Data: SmallInt); stdcall;
  • 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:

 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;

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:

 procedure TMyForm.FormDestroy(Sender: TObject);
 begin
 {$IFDEF WIN32}
   FreeLibrary(Inpout32);
 {$ENDIF}
 end;

Itt egy egyszerű példa az Inp32 funkció használatára:

 {$IFDEF WIN32}
   myLabel.Caption := IntToStr(Inp32($0220));
 {$ENDIF}

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::

 {$ASMMODE ATT}
 ...
    asm
        movl $0x320, %edx
        movb $0xCC, %al
        outb %al, %dx
    end ['EAX','EDX'];

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...

Az IOPerm használata portok eléréséhez Linuxon

A hardverek elérésének legjobb módja Linux-on az eszközmeghajtók használata, azonban a meghajtókészítés folyamatának bonyolultsága miatt néha egy gyorsabb megoldás kézenfekvőbb. Ahhoz hogy a "ports" unit-ot használhasd Linux-on a programodat rendszergazdaként kell futtatni, és az IOPerm segítségével a port eléréséhez megfelelő jogosultságokat kell beállítani.. A "ports" unit dokumentációját itt találod.

Az első teendő a Libc linkelése és azIOPerm meghívása. Van egy unit a free pascalban ami linkeli a meglévő (g) libc-t, azonban ez hibát okoz ha közvetlenül hívjuk meg az alkalmazásból és statikusan kerül felhasználásra, mivel a verziók közötti változások kompatibilitási problémákat okozhatnak. A függvények mint az ioperm valószínűleg nem változnak.


 {$IFDEF Linux}
 function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
 {$ENDIF}
  • "from" az első port amelyet el akarsz érni.
  • "num" a portok száma az elsőtől amelyeket el akarsz érni, az IOPerm($220, 8, 1) hozzáférést biztosít a program számára az összes porthoz beleértve a $220 és $227 portokat is.

Az IOPerm meghívása után a port[<cím>] forma használható.

 {$IFDEF Linux}
   i := ioperm($220, 8, 1);
   port[$220] := $00;
   myLabel.Caption := 'ioperm: ' + IntToStr(i);
   i := Integer(port[$220]);
   myOtherLabel.Caption := 'response: ' + IntToStr(i);
 {$ENDIF}

Ez a kód egy általános ISA kártya $0220-as portján lett kipróbálva, a Lazarus 0.9.10 változatával Mandriva Linux 2005 és Damn Small Linux 1.5 rendszereken.

Általános UNIX Hardver Elérés

{$IFDEF Unix}
Uses Clib;   // kinyeri a libc könyvtár nevét
{$ENDIF}

{$IFDEF Unix}
function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external clib;
{$ENDIF}


Az FPC egy absztrakt hívással az "fpioperm" -el éri el az ioperm-t ez a x86 unit-ban található, és szintén definiálja az fpIOPL-t és az out-/inport függvényeket. Ezek a függvények állnak rendelkezésre jelenleg a Linux/x86 és a FreeBSD/x86 rendszerben.

Ennek a linkelése nem ajánlott a libc-hez csak ha a telepítés és a hordozhatóság megvalósítható.

A libc kézi linkelése (pl a libc függvényeinek ad-hoc deklarásával amelyek valahol fellelhetőek) szintén kerülendő (illetve a libc import sor szükségszerűen hibát dob, mivel a standard C lib nem hívja meg a libc-t, továbbá pl. a libroot a BEos vagy más platformokon nem szabványos C szimbólumokat használ). Egyszóval kompatibilitási hibákat okoz.

Megjegyzés: A libc unit használata semmilyen körülmények között nem ajánlott, kivétel a Kylix kompatibilitás. Lásd: libc unit

Soros kommunikáció

Soros kommunikációt végző szoftver építése nagyon egyszerű a Synaser függvénytár használatával. A példa együtt áttekintve a Synaser dokumentációjával könnyen érthető. A leglényegesebb rész a TBlockSerial.Config mellyel beállítható a sebesség (bitek száma másodpercenként), valamint az adat bitek, az ellenörző (parity) bitek, vezérlő (stop) bitek és kapcsolódási (handshake) protokol, ha van. A következő kód egy COM 1-re sorosan csatlakozó egérrel lett tesztelve.

program comm;

{$apptype console}

uses
  Classes, SysUtils, Synaser;

var
  ser: TBlockSerial;
begin
  ser:=TBlockSerial.Create;
  try
    ser.Connect('COM1');
    ser.config(1200, 7, 'N', SB1, False, False);
    while True do
      Write(IntToHex(ser.RecvByte(10000), 2), ' ');
  finally
    ser.free;
  end;
end.


A következő kód a fentebbi példa egy másik változata. A fentebbi példa alapvetően hibásnak tűnik a "while true do..." ciklus használata miatt. A teszteléshez használt rendszeren (Asus A6T Laptop, Digitus USB-RS232 Adapterrel, Ubuntu 8.04.1), ez a rész a következő hibát okozta: Az alkalmazás munkamenetenként csak egyszer futott hibátlanul, amikor az alkalmazás újra lett indítva, már nem tudott csatlakozni a soros porthoz. Így a rendszer újraindítására volt szükség minden alkalommal amikor a felhasználó az alkalmazást újra használni akarta, ez pedig nagyon zavaró hiba.

program serialtest;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes,SysUtils,Synaser,Crt
  { ez után jöhetnek a unit-ok };

  var l:boolean;

  function check_affirmation():boolean;
  var k:string;
  begin
       Writeln('A kilépéshez NE használd a CTRL-C gombokat, inkább valamelyik másik gombbal állítsd le az alkalmazást! '+
       'Válassz a lehetőségek közül! '+
       '[0]=Kilépés, [1]=Rendben, folytatás! ');
       Writeln('Választás: ');
       Read(k);
       if StrtoInt(k) = 1 then
       begin
            check_affirmation:=true;
            Writeln('OK, az alkalmazás tovább fut ...');
       end
       else
       begin
            check_affirmation:=false;
            Writeln('Kilépés');
       end
  end;

  procedure RS232_connect;
  var
     ser: TBlockSerial;
  begin
       ser:=TBlockSerial.Create;
       try
          ser.Connect('/dev/ttyUSB0'); //ComPort
          Sleep(1000);
          ser.config(1200, 7, 'N', SB1, False, False);
          Write('Eszköz: ' + ser.Device + '   Állapot: ' + ser.LastErrorDesc +' '+
          Inttostr(ser.LastError));
          Sleep(1000);
          repeat
                Write(IntToHex(ser.RecvByte(10000), 2), ' ');
          until keypressed; //Important!!!
       finally
              Writeln('A soros port fel lesz szabadítva...');
              ser.free;
              Writeln('A soros port sikeresen fel lett szabadítva!');
       end;
  end;

  begin
     l:=check_affirmation();
     if l=true then
     RS232_connect()
     else
     Writeln('Kilépés a programból! ');
  end.

A külső hivatkozások részben UNIX és Windows soros port kezeléssel foglalkozó írások címei találhatók.

USB

libusb

Egy keresztplatformos lehetőség Linux, BSD és macOS rendszerekhez a libusb.

A fejlécek megtalálhatók a http://www.freepascal.org/contrib/db.php3?category=Miscellaneous címen:

név szerző változat dátum link megjegyzés
libusb.pp Uwe Zimmermann 0.1.12 2006-06-29 http://www.sciencetronics.com/download/fpc_libusb.tgz
libusb.pas Johann Glaser 2005-01-14 http://www.johann-glaser.at/projects/libusb.pas
fpcusb Joe Jared 0.11-14 2006-02-02 http://relays.osirusoft.com/fpcusb.tgz hibás letöltési cím

FTDI

Az 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

Kommunikációs Protokolok sebességének összehasonlítása:

  1. http://en.wikipedia.org/wiki/Serial_port#Speed
  2. http://www.lvr.com/jansfaq.htm - Jan Axelson's Parallel Port FAQ
  3. http://en.wikipedia.org/wiki/USB#Transfer_Speed
  4. http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications

Soros Kommunikációval kapcsolatos hivatkozások:

  1. UNIX-on: [1]
  2. Windows-on: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp
  3. Synaser komponens: http://synapse.ararat.cz/
  4. Comport Delphi csomag: http://sourceforge.net/projects/comport/

ISA Digital Oscilloscope - Egy példa a hardverelérésre teljes forráskóddal: http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/