Difference between revisions of "Hardware Access/fr"

From Lazarus wiki
Jump to navigationJump to search
m (Fixed syntax highlighting)
 
(33 intermediate revisions by 3 users not shown)
Line 2: Line 2:
 
__TOC__
 
__TOC__
 
==Vue d'ensemble ==
 
==Vue d'ensemble ==
Cette page est le début d'un tutoriel sur la manière d'accéder aux dispositifs matériels de Lazarus. Ces dispositifs incluent les suivant , mais ne sont pas limités à eux: ISA, PCI, USB, port parallèle , porte série .
+
Cette page est le début d'un tutoriel sur la manière d'accéder aux périphériques matériels de Lazarus. Ces dispositifs incluent les matériels suivants, mais ne sont pas limités à ceux-ci: ISA, PCI, USB, port parallèle, port série.
  
Access to hardware devices on a completely multi-platform way is not implemented by Free Pascal Runtime Library or by the LCL, so this tutorial will basically cover hardware access methods on different platforms. The code can be compiled on different environments using conditional compiles, like this:
+
L'accès aux périphériques matériels d'une façon complètement multi-plate-forme n'est pas implémenté par la bibliothèque d'exécution de Free Pascal ou par la LCL. Aussi ce tutoriel va fondamentalement couvrir des méthodes d'accès matérielles sur des plates-formes diverses. Le code peut être compilé sur différents environnements en employant la compilation conditionnelle, comme ceci :
  
<code>
+
<syntaxhighlight lang=pascal>
 
  uses
 
  uses
 
   Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
 
   Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
Line 15: Line 15:
 
   ports;
 
   ports;
 
  {$ENDIF}
 
  {$ENDIF}
</code>
+
</syntaxhighlight>
  
It is not known yet, at this time, if Mac OS X/x86 will allow HW access. It can disallow it, though I assume in that case, in time, drivers like io.dll will appear.
+
On ne sait pas encore, pour l'instant, si Mac OS X/x86 permettra des accès HW. Il peut le rejeter, quoique dans ce cas je suppose qu'à terme des pilotes de périphériques comme io.dll apparaîtrons.
  
==Parallel and Serial Comparison==
+
==Comparaison parallèle et série ==
ISA Cards, PCI Cards and the Parallel Port communicate with the computer using a '''parallel''' protocol. The Serial Port and USB devices work with a '''serial''' protocol. Because the processor and thus programming languages all work on a parallel approach to data, access to this kinds of protocols is easier to be implemented on the software side. When you access an Integer variable, for example, you can access it's value with a single command. With a serial protocol, however, you can only know one bit at a time, and you need to glue the pieces together to understand the data.
+
Les cartes ISA, les cartes PCI et le port parallèle communiquent avec l'ordinateur en utilisant un protocole '''parallèle '''. Le port série et les périphériques USB travaillent avec un protocole  '''série'''. Puisque le processeur et de ce fait les langages de programmation travaillent tous dans une approche parallèle aux données, accéder à ces diverses sortes de protocoles est plus simple à implémenter du coté logiciel. Quand vous accédez par exemple à une variable entière (Integer), vous pouvez accéder à sa valeur par une commande simple. Cependant, avec un protocole série, vous pouvez seulement connaître un bit à la fois et vous devez coller les morceaux ensemble pour comprendre les données.
  
Serial communication is difficult to be implemented directly, but it can be pretty easy if you use a pre-made component. It is also harder on the hardware side, so many devices use specialised Integrated Circuits or even Microcontrolers to implement it.
+
La communication série est difficile à implémenter directement, mais ce peut être assez facile si vous employez un composant tout-prêt. C'est également plus dur du côté matériel, aussi la plupart des périphériques utilisent des circuits intégrés spécialisés ou même des microcontrôleurs pour l'implémenter.
  
Now a brief comparison of hardware access protocols will be given:
+
Voici une brève comparaison des protocoles d'accès au matériel:
  
 
{| border=2 width="100%"
 
{| border=2 width="100%"
Line 30: Line 30:
 
|-
 
|-
 
!
 
!
! Speed
+
! Vitesse
! Hardware implementation difficulty
+
! Difficulté d'implémentation matérielle
  
 
|-
 
|-
! Serial Port
+
! Port série
| align="center" | Very slow (< E5 bit/s)
+
| align="center" | Très lent  (< E5 bit/s)
| align="center" | Medium
+
| align="center" | Milieu
  
 
|-
 
|-
! Parallel Port
+
! Port parallèle
| align="center" | Slow (~ E6 bit/s)
+
| align="center" | Lent  (~ E6 bit/s)
| align="center" | Easy
+
| align="center" | Facile
  
 
|-
 
|-
  
! ISA Card
+
! Carte ISA  
| align="center" | Medium (~ E7 bit/s)
+
| align="center" | Milieu  (~ E7 bit/s)
| align="center" | Medium
+
| align="center" | Milieu
  
 
|-
 
|-
 
! USB
 
! USB
| align="center" | Medium (~ E7 bit/s)
+
| align="center" | Milieu  (~ E7 bit/s)
| align="center" | Hard
+
| align="center" | Dur
  
 
|-
 
|-
! PCI Card
+
! Carte PCI  
| align="center" | Very Fast (> E9 bit/s)
+
| align="center" | Très rapide  (> E9 bit/s)
| align="center" | Very Hard
+
| align="center" | Très dur
  
 
|}
 
|}
  
==Parallel Communication==
+
==Communication parallèle ==
  
===Using inpout32.dll for Windows===
+
===Utilisation de inpout32.dll pour Windows===
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 a différentes manières d'accéder aux périphériques matériels sur les séries 9x et sur les séries NT. Sur les séries 9x (95, 98, Me) les programmes peuvent accéder au matériel directement , juste comme ils faisaient avec le DOS. Les séries de NT (Windows NT et XP), cependant , ne permettent pas cette approche. Sur cette architecture , toute communication avec des ports matériel doit être effectuée au travers d'un pilote de périphérique. C'est un mécanisme de sécurité, mais développer un pilote peut coûter beaucoup trop en termes de temps et d'argent pour de petits projets.
  
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.
+
Heureusement  il y a une bibliothèque qui résout ce problème.Si Windows NT est détecté, il décompresse le noyau du pilote de périphérique HWInterface.sys et l'installe. Si Windows 9x est détecté, il emploie simplement des codes d'opération en assembleur pour accéder au matériel .
  
But how do I use the library? Simple! It has only two functions, Inp32 and Out32, and their use is quite intuitive.
+
Mais comment j'emploie la bibliothèque ? Simple! Il a seulement deux fonctions , Inp32 et Out32, et leur utilisation est tout à fait intuitive .
  
We will load the library dynamically, so let's define both functions first:
+
Nous chargerons la bibliothèque dynamiquement, ainsi définissons les deux fonctions d'abord :
  
<code>
+
<syntaxhighlight lang=pascal>
 
  type
 
  type
 
   TInp32 = function(Address: ShortInt): ShortInt; stdcall;
 
   TInp32 = function(Address: ShortInt): ShortInt; stdcall;
 
   TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;
 
   TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;
</code>
+
</syntaxhighlight>
  
* Address represents the address of the port you desire to access
+
* L'adresse représente l'adresse du port que vous désirez accéder
* Out32 sends Data to the port you specify by Address
+
* Out32 envoie des données au port que vous indiquez avec l'adresse
* Inp32 returns a byte from the port you specify by Address
+
* Inp32 renvoie un octet du port que vous indiquez par l'adresse
  
Now we can load the library. This can be implemented in a place like the OnCreate method of your program's main form:
+
Maintenant nous pouvons charger la bibliothèque. Ceci peut être implémenté dans un endroit comme la méthode OnCreate de fiche principale de votre programme :
  
<code>
+
<syntaxhighlight lang=pascal>
 
  type
 
  type
 
   TMyForm = class(TForm)
 
   TMyForm = class(TForm)
Line 111: Line 111:
 
  {$ENDIF}
 
  {$ENDIF}
 
  end;
 
  end;
</code>
+
</syntaxhighlight>
  
If you load the library on OnCreate just don't forget to unload it in OnDestroy:
+
Si vous chargez la bibliothèque sur OnCreate juste ne pas oublier de le décharger dans OnDestroy:
  
<code>
+
<syntaxhighlight lang=pascal>
 
  procedure TMyForm.FormDestroy(Sender: TObject);
 
  procedure TMyForm.FormDestroy(Sender: TObject);
 
  begin
 
  begin
Line 122: Line 122:
 
  {$ENDIF}
 
  {$ENDIF}
 
  end;
 
  end;
</code>
+
</syntaxhighlight>
  
Here is a simple example of how to use Inp32 function:
+
Voici un exemple simple de la façon d'employer la fonction Inp32 :
  
<code>
+
<syntaxhighlight lang=pascal>
 
  {$IFDEF WIN32}
 
  {$IFDEF WIN32}
 
   myLabel.Caption := IntToStr(Inp32($0220));
 
   myLabel.Caption := IntToStr(Inp32($0220));
 
  {$ENDIF}
 
  {$ENDIF}
</code>
+
</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.
+
Ce code a été testé avec une carte habituelle ISA sur le port $0220, en utilisant Lazarus 0.9.10 sous Windows XP. Naturellement, vous devrez avoir Windows sur votre clause d'utilisations afin que ce code s'exécute. Pour le déploiement vous devez seulement inclure  "inpout32.dll" dans le même répertoire de notre application .
  
This is the homepage for the library: [http://www.logix4u.net/inpout32.htm www.logix4u.net/inpout32.htm]  *see discussion*
+
C'est la page d'accueil pour la bibliothèque : [http://www.logix4u.net/inpout32.htm www.logix4u.net/inpout32.htm]  *voir la discussion *
  
===Using assembler on Windows 9x===
+
===Employer l'assembleur sur Windows 9x ===
  
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:
+
Sur  Windows 9x vous pouvez également employer le code assembleur . Supposons que vous souhaitez écrire $CC sur le port $320 . Le code suivant le fera :
  
<code>
+
<syntaxhighlight lang=pascal>
 
  {$ASMMODE ATT}
 
  {$ASMMODE ATT}
 
  ...
 
  ...
Line 148: Line 148:
 
         outb %al, %dx
 
         outb %al, %dx
 
     end ['EAX','EDX'];
 
     end ['EAX','EDX'];
</code>
+
</syntaxhighlight>
  
===Troubleshooting on Windows===
+
===Dépannage sur Windows===
  
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:
+
Une source possible d'ennui dans l'utilisation de matériel parallèle qui ne supporte pas le "Plug And Play" sur Windows est que Windows peut assigner le port utilisé par votre matériel à un autre périphérique. Vous pouvez trouver des instructions sur l'URL ci-dessous concernant la façon de dire à Windows de ne pas assigner l'adresse de votre périphérique aux périphériques "Plug And Play":
  
 
http://support.microsoft.com/kb/135168
 
http://support.microsoft.com/kb/135168
  
===Using ioperm to access ports on Linux===
+
===Utilisation de ioperm pour accéder à des ports sur  Linux===
  
The best way to access the hardware on Linux is throught device drivers, but, due to the complexity of the task of creating a driver, sometimes a quick method is very useful.
+
La meilleure manière d'accéder au matériel sur Linux est au travers des drivers de périphérique, mais , en raison de la complexité de la création d'un driver, parfois une méthode rapide est très utile .
  
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].
+
Afin d'employer l'unité "[[doc:rtl/ports|ports]]" sous Linux votre programme doit être exécuté comme root , et IOPerm doit  être appelé pour fixer des permissions appropriées sur l'accès au port. Vous pouvez trouver de la documentation au sujet de l'unité "[[doc:rtl/ports|ports]]" [http://www.freepascal.org/docs-html/rtl/ports/index.html ici].
  
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.
+
La première chose à faire est le lien à (g)libc et l'appel de IOPerm. Une unité qui est liée à (g)libc en entier existe sur free pascal, mais cette unité donne des problèmes quand elle est utilisée directement par l'application est être lié statiquement à la bibliothèque (g)libc dans son entier n'est pas une idée très bonne parce qu'il y a souvent des changements entre les versions d'une façon incompatible. Les fonctions comme ioperm, cependant, sont peu susceptible de changer .
  
<code>
+
<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}
</code>
+
</syntaxhighlight>
  
* "from" represents the first port to be accessed.
+
* "from" représente le premier port à accéder .
* "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" est le nombre de ports après le premier à être accédé, ainsi  ioperm($220, 8, 1) donnera l'accès pour le programme  pour tous les ports entre $220 et $227 et incluant les valeurs limites .
  
After linking to IOPerm you can port[<Address>] to access the ports.
+
Après la liaison à IOPerm vous pouvez écrire port[<Address>] pour accéder aux ports.
  
<code>
+
<syntaxhighlight lang=pascal>
 
  {$IFDEF Linux}
 
  {$IFDEF Linux}
 
   i := ioperm($220, 8, 1);
 
   i := ioperm($220, 8, 1);
Line 183: Line 183:
 
   myOtherLabel.Caption := 'response: ' + IntToStr(i);
 
   myOtherLabel.Caption := 'response: ' + IntToStr(i);
 
  {$ENDIF}
 
  {$ENDIF}
</code>
+
</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
+
Ce code a été testé avec une carte ISA ordinaire sur le port $0220, en utilisant Lazarus 0.9.10 sur Mandriva Linux 2005 et Damn Small Linux 1.5
  
===General UNIX Hardware Access===
+
===Access général au matériel UNIX ===
  
<pre>
+
<syntaxhighlight lang=pascal>
 
{$IFDEF Unix}
 
{$IFDEF Unix}
Uses Clib;  // retrieve libc library name.
+
Uses Clib;  // rechercher de la bibliothèque libc.
 
{$ENDIF}
 
{$ENDIF}
  
Line 197: Line 197:
 
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}
 
{$ENDIF}
</pre>
+
</syntaxhighlight>
  
  
'''Note''' that FPC provides an abstraction for ioperm called "fpioperm" in [[doc:rtl/x86/index.html|unit x86]], and also defines out and inport functions. These functions are currently implemented for Linux/x86 and FreeBSD/x86.
+
'''Note''' que FPC fournit une abstraction pour ioperm appelée "fpioperm" dans [[doc:rtl/x86/index.html|unité x86]], et définit également les fonctions out et import.Ces fonctions sont actuellement implémentées pour Linux/x86 et FreeBSD/x86.
  
It is not recommended to link to libc unless absolutely necessary due to possible deployment and portability functions.
+
Il n'est pas recommandé de faire la liaison à libc à moins d'une absolue nécessité due aux possibles fonctions de déploiement et de portabilité.
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).
+
En outre un lien manuel à libc (en déclarant ad hoc que libc importe des fonctions qui sont disponible ailleurs) comme fait l'exemple ci-dessus n'est pas recommandé (e.g. la ligne d'importation de libc ci-dessus va échouer inutilement si la bibliothèque standard de C ne s'appelle pas libc, comme  e.g. libroot sur BeOS, ou sur les plate-formes avec une mutilation de symboles C non standard).
  
'''Note 2''' Using _unit_ libc is not recommended under any circumstances other than Kylix compability. This because the unit is relatively unportable (due to excessive exposure of structures and other private symbols) and must only be modified as little as possible out of Kylix compability issues.
+
'''Note 2''' L'utilisation de _unit_ libc n'est pas recommandée dans toutes circonstances autres que la compatibilité avec Kylix. Ceci parce que l'unité est relativement non portable (en raison de l'exposition excessive des structures et d'autres symboles privés ) et doit seulement être modifié le moins possible hors des questions de compatibilité avec Kylix .
  
==Serial Communication==
+
==Communication série ==
  
The [[Hardware Access#External Links | External Links]] section has UNIX and Windows serial port tutorials.
+
la section des [[Hardware Access/fr#External Links | Liens externes ]] a des tutoriels sur les ports série sous UNIX et Windows.
  
==External Links==
+
==Liens externes ==
  
Communication Protocols speed comparison:
+
Comparaison de vitesse des protocoles de communication :
  
 
# http://en.wikipedia.org/wiki/Serial_port#Speed
 
# http://en.wikipedia.org/wiki/Serial_port#Speed
Line 220: Line 220:
 
# http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications
 
# http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications
  
Serial Communication Links:
+
Liens de communication série:
  
# On UNIX: [http://www.easysw.com/~mike/serial/serial.html]
+
# Sur UNIX: [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
+
# Sur Windows: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp
# Synaser component: http://synapse.ararat.cz/
+
# Composant Synaser : http://synapse.ararat.cz/
# Comport Delphi package: http://sourceforge.net/projects/comport/
+
# paquet Delphi Comport: http://sourceforge.net/projects/comport/
  
ISA Digital Oscilloscope - A example of hardware access with full source included:
+
Oscilloscope Digital ISA - Un exemple de l'accès au matériel avec les sources complètes incluses :[http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/]
 
 
[http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/]
 

Latest revision as of 12:18, 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)

Vue d'ensemble

Cette page est le début d'un tutoriel sur la manière d'accéder aux périphériques matériels de Lazarus. Ces dispositifs incluent les matériels suivants, mais ne sont pas limités à ceux-ci: ISA, PCI, USB, port parallèle, port série.

L'accès aux périphériques matériels d'une façon complètement multi-plate-forme n'est pas implémenté par la bibliothèque d'exécution de Free Pascal ou par la LCL. Aussi ce tutoriel va fondamentalement couvrir des méthodes d'accès matérielles sur des plates-formes diverses. Le code peut être compilé sur différents environnements en employant la compilation conditionnelle, comme ceci :

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

On ne sait pas encore, pour l'instant, si Mac OS X/x86 permettra des accès HW. Il peut le rejeter, quoique dans ce cas je suppose qu'à terme des pilotes de périphériques comme io.dll apparaîtrons.

Comparaison parallèle et série

Les cartes ISA, les cartes PCI et le port parallèle communiquent avec l'ordinateur en utilisant un protocole parallèle . Le port série et les périphériques USB travaillent avec un protocole série. Puisque le processeur et de ce fait les langages de programmation travaillent tous dans une approche parallèle aux données, accéder à ces diverses sortes de protocoles est plus simple à implémenter du coté logiciel. Quand vous accédez par exemple à une variable entière (Integer), vous pouvez accéder à sa valeur par une commande simple. Cependant, avec un protocole série, vous pouvez seulement connaître un bit à la fois et vous devez coller les morceaux ensemble pour comprendre les données.

La communication série est difficile à implémenter directement, mais ce peut être assez facile si vous employez un composant tout-prêt. C'est également plus dur du côté matériel, aussi la plupart des périphériques utilisent des circuits intégrés spécialisés ou même des microcontrôleurs pour l'implémenter.

Voici une brève comparaison des protocoles d'accès au matériel:

Vitesse Difficulté d'implémentation matérielle
Port série Très lent (< E5 bit/s) Milieu
Port parallèle Lent (~ E6 bit/s) Facile
Carte ISA Milieu (~ E7 bit/s) Milieu
USB Milieu (~ E7 bit/s) Dur
Carte PCI Très rapide (> E9 bit/s) Très dur

Communication parallèle

Utilisation de inpout32.dll pour Windows

Windows a différentes manières d'accéder aux périphériques matériels sur les séries 9x et sur les séries NT. Sur les séries 9x (95, 98, Me) les programmes peuvent accéder au matériel directement , juste comme ils faisaient avec le DOS. Les séries de NT (Windows NT et XP), cependant , ne permettent pas cette approche. Sur cette architecture , toute communication avec des ports matériel doit être effectuée au travers d'un pilote de périphérique. C'est un mécanisme de sécurité, mais développer un pilote peut coûter beaucoup trop en termes de temps et d'argent pour de petits projets.

Heureusement il y a une bibliothèque qui résout ce problème.Si Windows NT est détecté, il décompresse le noyau du pilote de périphérique HWInterface.sys et l'installe. Si Windows 9x est détecté, il emploie simplement des codes d'opération en assembleur pour accéder au matériel .

Mais comment j'emploie la bibliothèque ? Simple! Il a seulement deux fonctions , Inp32 et Out32, et leur utilisation est tout à fait intuitive .

Nous chargerons la bibliothèque dynamiquement, ainsi définissons les deux fonctions d'abord :

 type
   TInp32 = function(Address: ShortInt): ShortInt; stdcall;
   TOut32 = procedure(Address: ShortInt; Data: ShortInt); stdcall;
  • L'adresse représente l'adresse du port que vous désirez accéder
  • Out32 envoie des données au port que vous indiquez avec l'adresse
  • Inp32 renvoie un octet du port que vous indiquez par l'adresse

Maintenant nous pouvons charger la bibliothèque. Ceci peut être implémenté dans un endroit comme la méthode OnCreate de fiche principale de votre programme :

 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;

Si vous chargez la bibliothèque sur OnCreate juste ne pas oublier de le décharger dans OnDestroy:

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

Voici un exemple simple de la façon d'employer la fonction Inp32 :

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

Ce code a été testé avec une carte habituelle ISA sur le port $0220, en utilisant Lazarus 0.9.10 sous Windows XP. Naturellement, vous devrez avoir Windows sur votre clause d'utilisations afin que ce code s'exécute. Pour le déploiement vous devez seulement inclure "inpout32.dll" dans le même répertoire de notre application .

C'est la page d'accueil pour la bibliothèque : www.logix4u.net/inpout32.htm *voir la discussion *

Employer l'assembleur sur Windows 9x

Sur Windows 9x vous pouvez également employer le code assembleur . Supposons que vous souhaitez écrire $CC sur le port $320 . Le code suivant le fera :

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

Dépannage sur Windows

Une source possible d'ennui dans l'utilisation de matériel parallèle qui ne supporte pas le "Plug And Play" sur Windows est que Windows peut assigner le port utilisé par votre matériel à un autre périphérique. Vous pouvez trouver des instructions sur l'URL ci-dessous concernant la façon de dire à Windows de ne pas assigner l'adresse de votre périphérique aux périphériques "Plug And Play":

http://support.microsoft.com/kb/135168

Utilisation de ioperm pour accéder à des ports sur Linux

La meilleure manière d'accéder au matériel sur Linux est au travers des drivers de périphérique, mais , en raison de la complexité de la création d'un driver, parfois une méthode rapide est très utile .

Afin d'employer l'unité "ports" sous Linux votre programme doit être exécuté comme root , et IOPerm doit être appelé pour fixer des permissions appropriées sur l'accès au port. Vous pouvez trouver de la documentation au sujet de l'unité "ports" ici.

La première chose à faire est le lien à (g)libc et l'appel de IOPerm. Une unité qui est liée à (g)libc en entier existe sur free pascal, mais cette unité donne des problèmes quand elle est utilisée directement par l'application est être lié statiquement à la bibliothèque (g)libc dans son entier n'est pas une idée très bonne parce qu'il y a souvent des changements entre les versions d'une façon incompatible. Les fonctions comme ioperm, cependant, sont peu susceptible de changer .

 {$IFDEF Linux}
 function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
 {$ENDIF}
  • "from" représente le premier port à accéder .
  • "num" est le nombre de ports après le premier à être accédé, ainsi ioperm($220, 8, 1) donnera l'accès pour le programme pour tous les ports entre $220 et $227 et incluant les valeurs limites .

Après la liaison à IOPerm vous pouvez écrire port[<Address>] pour accéder aux ports.

 {$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}

Ce code a été testé avec une carte ISA ordinaire sur le port $0220, en utilisant Lazarus 0.9.10 sur Mandriva Linux 2005 et Damn Small Linux 1.5

Access général au matériel UNIX

{$IFDEF Unix}
Uses Clib;   // rechercher de la bibliothèque libc.
{$ENDIF}

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


Note que FPC fournit une abstraction pour ioperm appelée "fpioperm" dans unité x86, et définit également les fonctions out et import.Ces fonctions sont actuellement implémentées pour Linux/x86 et FreeBSD/x86.

Il n'est pas recommandé de faire la liaison à libc à moins d'une absolue nécessité due aux possibles fonctions de déploiement et de portabilité. En outre un lien manuel à libc (en déclarant ad hoc que libc importe des fonctions qui sont disponible ailleurs) comme fait l'exemple ci-dessus n'est pas recommandé (e.g. la ligne d'importation de libc ci-dessus va échouer inutilement si la bibliothèque standard de C ne s'appelle pas libc, comme e.g. libroot sur BeOS, ou sur les plate-formes avec une mutilation de symboles C non standard).

Note 2 L'utilisation de _unit_ libc n'est pas recommandée dans toutes circonstances autres que la compatibilité avec Kylix. Ceci parce que l'unité est relativement non portable (en raison de l'exposition excessive des structures et d'autres symboles privés ) et doit seulement être modifié le moins possible hors des questions de compatibilité avec Kylix .

Communication série

la section des Liens externes a des tutoriels sur les ports série sous UNIX et Windows.

Liens externes

Comparaison de vitesse des protocoles de communication :

  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

Liens de communication série:

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

Oscilloscope Digital ISA - Un exemple de l'accès au matériel avec les sources complètes incluses :[2]