Sign in Join
Wiki copytemporary

Hardware Access/es: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-## Contents
2-
3- * 1 Descripción
4- * 2 Comparación entre serie y paralelo
5- * 3 Comunicación Paralelo
6- * 3.1 Usando inpout32.dll para Windows
7- * 3.2 Using assembler on Windows 9x
8- * 3.3 Resolución de problemas en Windows
9- * 3.4 Utilizando ioperm para acceder puertos en Linux
10- * 3.5 Acceso general a hardware en UNIX
11- * 4 Comunicación Serie
12- * 5 USB
13- * 5.1 libusb
14- * 5.2 FTDI
15- * 6 Enlaces externos
16-
171## Descripción
182
19-Esta página es el comienzo de un tutorial que trata del acceso a dispositivos hardware. Estos dispositivos incluyen entre otros: ISA, PCI, USB, puerto paralelo, puerto serie, etc.
3+Esta página es el comienzo de un tutorial que trata del acceso a dispositivos hardware. Estos dispositivos incluyen entre otros: ISA, PCI, USB, puerto paralelo, puerto serie, etc.
204
21-El acceso a dispositivos hardware no esta implementado en la modalidad multiplataforma ni para el Runtime ni para el LCL de Free Pascal, por lo que este tutorial básicamente cubrirá los métodos de acceso a hardware en las diferentes plataformas. El código puede ser compilado en diferentes entornos utilizando compilaciones condicionales, como las siguientes:
22-```
23-uses
24- Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
25- {$IFDEF WIN32}
26- Windows;
27- {$ENDIF}
28- {$IFDEF Unix}
29- ports;
30- {$ENDIF}
5+El acceso a dispositivos hardware no esta implementado en la modalidad multiplataforma ni para el Runtime ni para el LCL de Free Pascal, por lo que este tutorial básicamente cubrirá los métodos de acceso a hardware en las diferentes plataformas. El código puede ser compilado en diferentes entornos utilizando compilaciones condicionales, como las siguientes:
6+
7+``` pascal
8+ uses
9+ Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
10+ {$IFDEF WIN32}
11+ Windows;
12+ {$ENDIF}
13+ {$IFDEF Unix}
14+ ports;
15+ {$ENDIF}
3116```
3217
33-No se sabe todavía, hasta el momento, si MAC OS X/x86 permitirá el acceso hardware. Puede que lo permita, por lo que puede que con el tiempo aparezcan drivers como io.dll.
18+No se sabe todavía, hasta el momento, si MAC OS X/x86 permitirá el acceso hardware. Puede que lo permita, por lo que puede que con el tiempo aparezcan drivers como io.dll.
3419
3520## Comparación entre serie y paralelo
3621
37-Las tarjetas ISA, PCI y el puerto paralelo se comunican con el ordenador utilizando un protocolo **paralelo**. El puerto serie y los dispositivos USB en cambio con un protocolo **serie**. Como tanto el procesador como todos los lenguajes de programación trabajan en una aproximación a datos en paralelo, el acceso a esta clase de protocolos es más fácil de implementar en la parte software. Por ejemplo, cuando se accede a una variable de tipo entero (Integer), es posible acceder a su valor asociado con un simple mandato. Con un protocolo serie, sin embargo, se puede conocer sólamente un bit en cada vez, y se hace necesario unir todos los bits para tener un dato con significado.
22+Las tarjetas ISA, PCI y el puerto paralelo se comunican con el ordenador utilizando un protocolo **paralelo**. El puerto serie y los dispositivos USB en cambio con un protocolo **serie**. Como tanto el procesador como todos los lenguajes de programación trabajan en una aproximación a datos en paralelo, el acceso a esta clase de protocolos es más fácil de implementar en la parte software. Por ejemplo, cuando se accede a una variable de tipo entero (Integer), es posible acceder a su valor asociado con un simple mandato. Con un protocolo serie, sin embargo, se puede conocer sólamente un bit en cada vez, y se hace necesario unir todos los bits para tener un dato con significado.
3823
39-La comunicación serie es difícil de implementar directamente, pero puede resultar razonablemente sencillo si se utiliza un componente prediseñado. También se bastante difícil en la parte hardware, por lo que algunos dispositivos utilizan Cirtuitos Integrados especializados o incluso Microcontroladores para implementarlo.
24+La comunicación serie es difícil de implementar directamente, pero puede resultar razonablemente sencillo si se utiliza un componente prediseñado. También se bastante difícil en la parte hardware, por lo que algunos dispositivos utilizan Cirtuitos Integrados especializados o incluso Microcontroladores para implementarlo.
4025
41-A continuación se presenta una breve comparación de protocolos de acceso a hardware:
26+A continuación se presenta una breve comparación de protocolos de acceso a hardware:
4227
43-
28+| | Velocidad | Dificultad de implementación hardware |
29+|----|:--:|:--:|
30+| Puerto serie | Muy lenta (\< E5 bit/s) | Media |
31+| Puerto Paralelo | Lenta (~ E6 bit/s) | Sencilla |
32+| Tarjeta ISA | Media (~ E7 bit/s) | Media |
33+| USB | Media (~ E7 bit/s) | Laboriosa |
34+| Tarjeta PCI | Muy rápida (\> E9 bit/s) | Muy laboriosa |
4435
45-| Velocidad | Dificultad de implementación hardware
46----|---|---
47-Puerto serie | Muy lenta (< E5 bit/s) | Media
48-Puerto Paralelo | Lenta (~ E6 bit/s) | Sencilla
49-Tarjeta ISA | Media (~ E7 bit/s) | Media
50-USB | Media (~ E7 bit/s) | Laboriosa
51-Tarjeta PCI | Muy rápida (> E9 bit/s) | Muy laboriosa
52-
5336## Comunicación Paralelo
5437
5538### Usando inpout32.dll para Windows
5639
57-Windows tiene diferentes modos de acceder a los dispositivos hardware en las series 9x y NT. En las series 9x (95,98,Me) los programas pueden acceder al hardware directamente, al igual que se hacía en DOS. En las series NT (Windows NT y XP), no es posible tal acceso directamente, por lo que se hace necesario un driver de dispositivo que permita el acceso a los puertos como un mecanismo de seguridad. Esto ocasiona que el desarrollo de un driver implique un aumento significativo en costes y tiempo empleado.
40+Windows tiene diferentes modos de acceder a los dispositivos hardware en las series 9x y NT. En las series 9x (95,98,Me) los programas pueden acceder al hardware directamente, al igual que se hacía en DOS. En las series NT (Windows NT y XP), no es posible tal acceso directamente, por lo que se hace necesario un driver de dispositivo que permita el acceso a los puertos como un mecanismo de seguridad. Esto ocasiona que el desarrollo de un driver implique un aumento significativo en costes y tiempo empleado.
5841
59-Afortunadamente existe una librería que resuelve este problema. Si se detecta un sistema con Windows NT se descomprime un controlador de dispositivo del kernel (HWInterface.sys) y lo instala, mientras que si detecta un sistema Windows 9x, entonces simplemente utiliza código en ensamblador para acceder al hardware.
42+Afortunadamente existe una librería que resuelve este problema. Si se detecta un sistema con Windows NT se descomprime un controlador de dispositivo del kernel (HWInterface.sys) y lo instala, mientras que si detecta un sistema Windows 9x, entonces simplemente utiliza código en ensamblador para acceder al hardware.
6043
61-Pero, ¿Como utilizo esta librería?, ¡Simple!, tiene solamente dos funciones, Inp32 y Out32, y su uso es muy intuitivo.
44+Pero, ¿Como utilizo esta librería?, ¡Simple!, tiene solamente dos funciones, Inp32 y Out32, y su uso es muy intuitivo.
6245
63-Cargaremos la libreria dinámicamente, por lo que definiremos ambas funciones primero:
64-```
65-type
66- TInp32 = function(Address: SmallInt): SmallInt; stdcall;
67- TOut32 = procedure(Address: SmallInt; Data: SmallInt); stdcall;
46+Cargaremos la libreria dinámicamente, por lo que definiremos ambas funciones primero:
47+
48+``` pascal
49+ type
50+ TInp32 = function(Address: SmallInt): SmallInt; stdcall;
51+ TOut32 = procedure(Address: SmallInt; Data: SmallInt); stdcall;
6852```
6953
70- * Address representa la dirección del puerto que se desea acceder
71- * Out32 envía datos al puerto que se especifica como dirección (Address)
72- * Inp32 retorna un byte desde el puerto que se especifica como dirección (Address)
54+- Address representa la dirección del puerto que se desea acceder
55+- Out32 envía datos al puerto que se especifica como dirección (Address)
56+- Inp32 retorna un byte desde el puerto que se especifica como dirección (Address)
7357
74-Ahora ya podemos cargar la librería. Esto puede implementarse en una sección como por ejemplo en el método OnCreate dentro del form principal:
75-```
76-type
77- TMyForm = class(TForm)
78- .........
79- private
80- { declaraciones privadas }
81- Inpout32: THandle; { tipo manejador para el puerto }
82- Inp32: TInp32;
83- Out32: TOut32;
84- .........
85- implementation
86- .........
87- procedure TMyForm.FormCreate(Sender: TObject);
88- begin
89- {$IFDEF WIN32}
90- Inpout32 := LoadLibrary('inpout32.dll');
91- if (Inpout32 <> 0) then
92- begin
93- // needs overtyping, plain Delphi's @Inp32 = GetProc... leads to compile errors
94- Inp32 := TInp32(GetProcAddress(Inpout32, 'Inp32'));
95- if (@Inp32 = nil) then Caption := 'Error';
96- Out32 := TOut32(GetProcAddress(Inpout32, 'Out32'));
97- if (@Out32 = nil) then Caption := 'Error';
98- end
99- else Caption := 'Error';
100- {$ENDIF}
101- end;
102-```
58+Ahora ya podemos cargar la librería. Esto puede implementarse en una sección como por ejemplo en el método OnCreate dentro del form principal:
10359
104-Si se carga la librería en la sección OnCreate no se debe olvidar descargarlo en la sección OnDestroy:
105-```
106-procedure TMyForm.FormDestroy(Sender: TObject);
107- begin
108- {$IFDEF WIN32}
109- FreeLibrary(Inpout32);
110- {$ENDIF}
111- end;
60+``` pascal
61+ type
62+ TMyForm = class(TForm)
63+ .........
64+ private
65+ { declaraciones privadas }
66+ Inpout32: THandle; { tipo manejador para el puerto }
67+ Inp32: TInp32;
68+ Out32: TOut32;
69+ .........
70+ implementation
71+ .........
72+ procedure TMyForm.FormCreate(Sender: TObject);
73+ begin
74+ {$IFDEF WIN32}
75+ Inpout32 := LoadLibrary('inpout32.dll');
76+ if (Inpout32 <> 0) then
77+ begin
78+ // needs overtyping, plain Delphi's @Inp32 = GetProc... leads to compile errors
79+ Inp32 := TInp32(GetProcAddress(Inpout32, 'Inp32'));
80+ if (@Inp32 = nil) then Caption := 'Error';
81+ Out32 := TOut32(GetProcAddress(Inpout32, 'Out32'));
82+ if (@Out32 = nil) then Caption := 'Error';
83+ end
84+ else Caption := 'Error';
85+ {$ENDIF}
86+ end;
11287```
11388
114-Este es un simple ejemplo de como utilizar la función Inp32:
89+Si se carga la librería en la sección OnCreate no se debe olvidar descargarlo en la sección OnDestroy:
90+
91+``` pascal
92+ procedure TMyForm.FormDestroy(Sender: TObject);
93+ begin
94+ {$IFDEF WIN32}
95+ FreeLibrary(Inpout32);
96+ {$ENDIF}
97+ end;
11598```
116-{$IFDEF WIN32}
117- myLabel.Caption := IntToStr(Inp32($0220));
118- {$ENDIF}
99+
100+Este es un simple ejemplo de como utilizar la función Inp32:
101+
102+``` pascal
103+ {$IFDEF WIN32}
104+ myLabel.Caption := IntToStr(Inp32($0220));
105+ {$ENDIF}
119106```
120107
121-Este código ha sido testeado con una tarjeta ISA en el puerto $0220, utilizando Lazarus 0.9.10 en Windows XP. Por supuesto es necesario tener Windows en la clausula uses para que funcione el código. Para el desarrollo solamente necesitas incluir "input32.dll" en el mismo directorio en que se encuentra la aplicación.
108+Este código ha sido testeado con una tarjeta ISA en el puerto \$0220, utilizando Lazarus 0.9.10 en Windows XP. Por supuesto es necesario tener Windows en la clausula uses para que funcione el código. Para el desarrollo solamente necesitas incluir "input32.dll" en el mismo directorio en que se encuentra la aplicación.
122109
123-La página principal de esta librería se encuentra en: [www.logix4u.net/inpout32.htm](<http://www.logix4u.net/inpout32.htm>) *ver discusión*
110+La página principal de esta librería se encuentra en: [www.logix4u.net/inpout32.htm](http://www.logix4u.net/inpout32.htm) *ver discusión*
124111
125112### Using assembler on Windows 9x
126113
127-En Windows 9x se permite el acceso directo al hardware por lo que es posible utilizar código ensamblador para acceder al mismo. Supongamos que queremos escribir el valor $CC en el puerto $320. Lo podemos realizar con las siguientes líneas de código (este ejemplo utiliza la sintaxis ATT en lugar de la de Intel):
128-```
129-{$ASMMODE ATT}
130- ...
131- asm
132- movl $0x320, %edx
133- movb $0xCC, %al
134- outb %al, %dx
135- end ['EAX','EDX'];
114+En Windows 9x se permite el acceso directo al hardware por lo que es posible utilizar código ensamblador para acceder al mismo. Supongamos que queremos escribir el valor \$CC en el puerto \$320. Lo podemos realizar con las siguientes líneas de código (este ejemplo utiliza la sintaxis ATT en lugar de la de Intel):
115+
116+``` pascal
117+ {$ASMMODE ATT}
118+ ...
119+ asm
120+ movl $0x320, %edx
121+ movb $0xCC, %al
122+ outb %al, %dx
123+ end ['EAX','EDX'];
136124```
137125
138126### Resolución de problemas en Windows
139127
140-Una posible fuente de problemas al utilizar hardware paralelo que no soporta Plug&Play en Windows es que Windows puede asignar el puerto utilizado por el hardware a otro dispositivo. Puedes encontrar instrucciones en la siguiente URL, de como indicar a Windows que no asigne la dirección del disoositivo a dispositivos Plug&Play:
128+Una posible fuente de problemas al utilizar hardware paralelo que no soporta Plug&Play en Windows es que Windows puede asignar el puerto utilizado por el hardware a otro dispositivo. Puedes encontrar instrucciones en la siguiente URL, de como indicar a Windows que no asigne la dirección del disoositivo a dispositivos Plug&Play:
141129
142130<http://support.microsoft.com/kb/135168>
143131
144132### Utilizando ioperm para acceder puertos en Linux
145133
146-La mejor manera de acceder al hardware en Linux es a través de drivers de dispositivos, pero, debido a la complejidad de crear un driver, algunas veces un método rápido es más útil.
134+La mejor manera de acceder al hardware en Linux es a través de drivers de dispositivos, pero, debido a la complejidad de crear un driver, algunas veces un método rápido es más útil.
147135
148-En orden a usar la unit "[ports](<http://lazarus-ccr.sourceforge.net/docs/rtl/ports> "doc:rtl/ports")" bajo Linux, el programa debe arrancarse como usuario root, y debe llamarse a IOPerm para establecer los permisos apropiados para acceso al puerto. Se puede encontrar documentación sobre la unit "[ports](<http://lazarus-ccr.sourceforge.net/docs/rtl/ports> "doc:rtl/ports")" en la siguiente URL: [[1]](<http://www.freepascal.org/docs-html/rtl/ports/index.html>)
136+En orden a usar la unit "[[doc:rtl/ports|ports]]" bajo Linux, el programa debe arrancarse como usuario root, y debe llamarse a IOPerm para establecer los permisos apropiados para acceso al puerto. Se puede encontrar documentación sobre la unit "[[doc:rtl/ports|ports]]" en la siguiente URL: [1](http://www.freepascal.org/docs-html/rtl/ports/index.html)
149137
150-Lo primero que debemos hacer es enlazar a (g)libc y llamar a IOPerm. En Free Pascal existe una unidad que enlaza enteramente a (g)libc, pero da lugar a problemas cuando se utiliza directamente por la aplicación y por tanto enlazarla estáticamente directamente a la librería (g)libc no es una buena idea porque siempre cambia de manera incomprensible entre versiones. Funciones como ioperm, como siempre, es poco probable que cambien.
151-```
152-{$IFDEF Linux}
153- function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
154- {$ENDIF}
138+Lo primero que debemos hacer es enlazar a (g)libc y llamar a IOPerm. En Free Pascal existe una unidad que enlaza enteramente a (g)libc, pero da lugar a problemas cuando se utiliza directamente por la aplicación y por tanto enlazarla estáticamente directamente a la librería (g)libc no es una buena idea porque siempre cambia de manera incomprensible entre versiones. Funciones como ioperm, como siempre, es poco probable que cambien.
139+
140+``` pascal
141+ {$IFDEF Linux}
142+ function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external 'libc';
143+ {$ENDIF}
155144```
156145
157- * "from" representa el primer puerto a ser accedido.
158- * "num" es el número de puertos despueś de acceder al primero, por lo que ioperm($220, 8, 1) permitirá el accceso por parte del programa a todos los puertos entre $220 y $227, ambos inclusive.
146+- "from" representa el primer puerto a ser accedido.
147+- "num" es el número de puertos despueś de acceder al primero, por lo que ioperm(\$220, 8, 1) permitirá el accceso por parte del programa a todos los puertos entre \$220 y \$227, ambos inclusive.
159148
160-Después de enlazar a IOPerm se puede utiliar port[<Address>] para acceder a los puertos:
161-```
162-{$IFDEF Linux}
163- i := ioperm($220, 8, 1); { se enlaza IOPerm }
164- port[$220] := $00; { utilizamos port para escribir el valor $00 en el puerto $220 }
165- myLabel.Caption := 'ioperm: ' + IntToStr(i);
166- i := Integer(port[$220]);
167- myOtherLabel.Caption := 'response: ' + IntToStr(i);
168- {$ENDIF}
149+Después de enlazar a IOPerm se puede utiliar port\[\<Address\>\] para acceder a los puertos:
150+
151+``` pascal
152+ {$IFDEF Linux}
153+ i := ioperm($220, 8, 1); { se enlaza IOPerm }
154+ port[$220] := $00; { utilizamos port para escribir el valor $00 en el puerto $220 }
155+ myLabel.Caption := 'ioperm: ' + IntToStr(i);
156+ i := Integer(port[$220]);
157+ myOtherLabel.Caption := 'response: ' + IntToStr(i);
158+ {$ENDIF}
169159```
170160
171-Este código fue testeado con una tarjeta ISA en el puerto $0220, utilizando Lazarus 0.9.10 en Mandriva Linux 2005 y Damn Small Linux 1.5.
161+Este código fue testeado con una tarjeta ISA en el puerto \$0220, utilizando Lazarus 0.9.10 en Mandriva Linux 2005 y Damn Small Linux 1.5.
172162
173163### Acceso general a hardware en UNIX
174-```
175-{$IFDEF Unix}
164+
165+ {$IFDEF Unix}
176166 Uses Clib; // retrieve libc library name.
177167 {$ENDIF}
178-
168+
179169 {$IFDEF Unix}
180170 function ioperm(from: Cardinal; num: Cardinal; turn_on: Integer): Integer; cdecl; external clib;
181171 {$ENDIF}
182-```
183172
184-
185-**Note** that FPC provides an abstraction for ioperm called "fpioperm" in [unit x86](<http://lazarus-ccr.sourceforge.net/docs/rtl/x86/index.html> "doc:rtl/x86/index.html"), and also defines out and inport functions. These functions are currently implemented for Linux/x86 and FreeBSD/x86.
173+**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.
186174
187-No se recomienda enlazar a libc a menos que sea absolutamente necesario debido a un posible diseño y portabilidad de funciones.
175+No se recomienda enlazar a libc a menos que sea absolutamente necesario debido a un posible diseño y portabilidad de funciones.
188176
189-Tampoco se recomienda el enlace manual a libc (declarando tal cual libc importado por funciones que son accesibles desde cualquier parte). Por ejemplo la línea de importación de libc fallará innecesariamente si la librería estandar no se llama desde libc, como por ejemplo libroot en BeOS, o en plataformas que no utilicen símbolos C estandar).
177+Tampoco se recomienda el enlace manual a libc (declarando tal cual libc importado por funciones que son accesibles desde cualquier parte). Por ejemplo la línea de importación de libc fallará innecesariamente si la librería estandar no se llama desde libc, como por ejemplo libroot en BeOS, o en plataformas que no utilicen símbolos C estandar).
190178
191-**Note 2** Utilizar la unidad _unit_ libc no es recomendable bajo ninguna circunstancia salvo para compatibilidad con Kylix. Esto es debido a que esta unidad es relativamente poco portable (debido a la excesiva exposición de estructuras y otros símbolos privados) y debe modificarse solamente tan poco como sea posible fuera de lo que implique su compatibilidad con Kylix.
179+**Note 2** Utilizar la unidad _unit_ libc no es recomendable bajo ninguna circunstancia salvo para compatibilidad con Kylix. Esto es debido a que esta unidad es relativamente poco portable (debido a la excesiva exposición de estructuras y otros símbolos privados) y debe modificarse solamente tan poco como sea posible fuera de lo que implique su compatibilidad con Kylix.
192180
193181## Comunicación Serie
194182
195-La sección [[Hardware Access|External Links]] tiene tutoriales para puertos serie bajo UNIX y Windows.
183+La sección [[Hardware Access|External Links]] tiene tutoriales para puertos serie bajo UNIX y Windows.
196184
197185## USB
198186
199187### libusb
200188
201-Una posibilidad para múltiples plataformas, para Linux, BSDs y Mac OS X es [libusb](<http://libusb.sourceforge.net/>).
189+Una posibilidad para múltiples plataformas, para Linux, BSDs y Mac OS X es [libusb](http://libusb.sourceforge.net/).
202190
203-Las cabeceras se listan en <http://www.freepascal.org/contrib/db.php3?category=Miscellaneous>:
191+Las cabeceras se listan en <http://www.freepascal.org/contrib/db.php3?category=Miscellaneous>:
204192
205-Nombre | Autor | Versión | Fecha | Enlace | Aclaraciones
206----|---|---|---|---|---
207-libusb.pp | Uwe Zimmermann | 0.1.12 | 2006-06-29 | <http://www.sciencetronics.com/download/fpc_libusb.tgz> |
208-libusb.pas | Johann Glaser | | 2005-01-14 | <http://www.johann-glaser.at/projects/libusb.pas> |
209-fpcusb | Joe Jared | 0.11-14 | 2006-02-02 | <http://relays.osirusoft.com/fpcusb.tgz> | enlace de descarga roto
210-
193+| Nombre | Autor | Versión | Fecha | Enlace | Aclaraciones |
194+|----|----|----|----|----|----|
195+| libusb.pp | nowrap \| Uwe Zimmermann | 0.1.12 | nowrap \| 2006-06-29 | <http://www.sciencetronics.com/download/fpc_libusb.tgz> | |
196+| libusb.pas | Johann Glaser | | nowrap \| 2005-01-14 | <http://www.johann-glaser.at/projects/libusb.pas> | |
197+| fpcusb | Joe Jared | 0.11-14 | nowrap \| 2006-02-02 | <http://relays.osirusoft.com/fpcusb.tgz> | nowrap \| enlace de descarga roto |
198+
211199### FTDI
212200
213-Si utilizas uno de los circuitos integrados (IC o chips) listados en [FTDI](<http://www.ftdichip.com/>), puedes utilizar sus cabeceras pascal para el interface dllcon los chips.
201+Si utilizas uno de los circuitos integrados (IC o chips) listados en [FTDI](http://www.ftdichip.com/), puedes utilizar sus cabeceras pascal para el interface dllcon los chips.
214202
215203## Enlaces externos
216204
217-Comparación de velocidades para protocolos de comunicación:
205+Comparación de velocidades para protocolos de comunicación:
218206
219- 1. <http://en.wikipedia.org/wiki/Serial_port#Speed>
220- 2. <http://www.lvr.com/jansfaq.htm> \- Jan Axelson's Parallel Port FAQ
221- 3. <http://en.wikipedia.org/wiki/USB#Transfer_Speed>
222- 4. <http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications>
207+1. <http://en.wikipedia.org/wiki/Serial_port#Speed>
208+2. <http://www.lvr.com/jansfaq.htm> - Jan Axelson's Parallel Port FAQ
209+3. <http://en.wikipedia.org/wiki/USB#Transfer_Speed>
210+4. <http://en.wikipedia.org/wiki/PCI#Conventional_PCI_bus_specifications>
223211
224-Enlaces de comunicación serie:
212+Enlaces de comunicación serie:
225213
226- 1. Bajo UNIX: [[2]](<http://www.easysw.com/~mike/serial/serial.html>)
227- 2. Bajo Windows: <http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp>
228- 3. Componente Synaser: <http://synapse.ararat.cz/>
229- 4. Comport Delphi package: <http://sourceforge.net/projects/comport/>
214+1. Bajo UNIX: [2](http://www.easysw.com/~mike/serial/serial.html)
215+2. Bajo Windows: <http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnfiles/html/msdn_serial.asp>
216+3. Componente Synaser: <http://synapse.ararat.cz/>
217+4. Comport Delphi package: <http://sourceforge.net/projects/comport/>
230218
231-Osciloscopio Digital ISA - Un ejemplo de acceso a hardware con todo el código fuente incluido:[[3]](<http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/>)
219+Osciloscopio Digital ISA - Un ejemplo de acceso a hardware con todo el código fuente incluido:[3](http://eletronicalivre.incubadora.fapesp.br/portal/english/oscilloscope/)
232220
233221---
234-*From the Free Pascal wiki, page "Hardware Access/es", as the Internet Archive kept it on 2023-03-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
222+*From the Free Pascal wiki, page "Hardware Access/es", as it stood on 2020-02-16 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
223+Category: Castellano
224+Category: Español

Back to history