DTR-RTS-CTS-DSR...

Manejo de Bits independientes a través de la USART, FTDI FT232xx o su homónimo PL2303xx:

Usar el puerto serie como si fuera paralelo.

Los diodos D1, D2 y D3 son opcionales.

Los valores de R4 a R7 pueden ser mayores de 1K.

Las entradas CTS-DSR-DCD-RI acepta señales tipo TTL.

Salidas: DTR - RTS - TxD

Entradas: CTS - DSR - (RI*) - DCD

* ("RI" sólo es compatible con la USART (Com1 y 2) que viene en el PC. En el caso de las FTDI seriales no siempre la tienen implementada porque sólo se usaban en los antiguos Modem Dial Up.)

Los dos programas que se exponen abajo de esta página sirven para controlar los bits de forma independiente del puerto serie físico y también es válido para puertos de comunicaciones virtuales. He tomado programas de otras webs***, los he modificado ligeramente (en el primer programa), con la intención de que se entendiera mejor.

*** Cliquea aquí, aquí y aquí para ver los programas originales (siempre en FreeBasic).

Para abrir el puerto serie puedes usar el formato COM1 al 8 como siempre, por ejemplo:

CreateFile( "COM1", GENERIC_READ Or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL )

pero más allá del COM8 hay que usar otro formato: "\\.\COMx" donde x puede ser del 1 al 255. Por ejemplo:

CreateFile( "\\.\COM18", GENERIC_READ Or GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL )

Para mantener la compatibilidad con todos los Windows (16,32 y 64 bits), usaremos este último. Si estás bajo MSDOS o Win9x recuerda usar puertos no superiores al COM8.

Para manejar puertos reales y si están en MSDOS o Win9x, puedes acceder al puerto serie de forma directa con Inp y Out. Esto no es posible en plataformas de 32/64 bits (XP, Vista, W7, W8, etc.) Cliquea aquí para ver un ejemplo de manejo de bits del puerto serie de forma directa bajo DOS o Win95/98/SE.

La velocidad de lectura y escritura es realmente baja en puertos virtuales porque aquí los estamos usando de forma indirecta. Para hacerlo de forma directa (y por tanto a máxima velocidad) se requiere de la DLL correspondiente y eso significa una programación aparte. Este proyecto es sólo una curiosidad sobre los puertos series que quizás puedas utilizar para algún pequeño invento sin utilizar circuitos externos para su control.

La USART del PC suele ser el Com1 y a veces también el Com2. Pero si usas COM virtuales y quieres averiguar en qué puerto COM está has de hacer lo siguiente:

Ves a: Inicio > Panel de Control > (Vista clásica) > Sistema > Hardware > Administrador de Dispositivos > Puertos Com & LPT > y pulsas en el símbolo '+', ahí verás la referencia al puerto COM seguido de un número.

Cambiar a otro puerto:

Estando en el mismo lugar, pulsando con el botón derecho a tu Puerto Virtual de Comunicaciones, le das a "Propiedades"; luego pulsas en la pestaña "Configuración de puerto".

En "Opciones avanzadas" verás justo abajo a la izquierda de esa ventana, te permite cambiar el número de puerto COM a otro. Si dice que está en uso, pero no está conectado el elemento que usa ese puerto, entonces puedes utilizarlo (hazlo sólo si tienes experiencia). Es compartir el puerto mientras esos dos elementos no estén al mismo tiempo.

Los programas.

En cualquiera de los dos programas has de pulsar "ESC" (tecla escape) para salir.

Puedes descargar los códigos fuentes y los ejecutables de los programas que están abajo cliqueando aquí:

(Si usas antivirus Avast has de añadir una exclusión para poder ejecutarlo. Para analizar este o cualquier otro archivo puedes hacer clic aquí)

Pines de salida:

TxD -----> patilla 3 del DB9

RTS -----> patilla 7 del DB9

DTR -----> patilla 4 del DB9

Masa ----> patilla 5 del DB9

Manejo en FreeBasic de las Salidas TxD, RTS y DTR del puerto COM (USART), o el FT232xx, o el PL2303xx:

The translation could modify the code. Use the code without translating or download the program by clicking the link above.
#Include "windows.bi"
Dim Letra As String
Dim hCom As HANDLE
Dim ComX As Integer
Screen 9
Locate 10,1: Input "Escribe solo el -numero- del puerto COM:"; ComX
' Es válido tanto para puertos reales como virtuales.
Color 14,1
Cls
Locate 10,1
Print " Observa el cambio de estado de los LED. Han de parpadear"
Print " secuencialmente, un segundo de tiempo cada uno."
Print
Print " Pulsa 'Escape' para salir; quiza tarde varios segundos en"
Print " tener efecto por la temporizacion que hay en el programa."
hCom = CreateFile( "\\.\COM" + Str( ComX ),_
GENERIC_READ Or GENERIC_WRITE,_
0,_
NULL,_
OPEN_EXISTING,_
0,_
NULL )
While Letra <> Chr( 27 )
   Letra=InKey()
   EscapeCommFunction( hCom, SETDTR ) ' DTR=1
   Sleep 500
   EscapeCommFunction( hCom, CLRDTR ) ' DTR=0
   Sleep 500
   EscapeCommFunction( hCom, SETRTS ) ' RTS=1
   Sleep 500
   EscapeCommFunction( hCom, CLRRTS ) ' RTS=0
   Sleep 500
   EscapeCommFunction( hCom, SETBREAK ) ' TxD=1
   Sleep 500
   EscapeCommFunction( hCom, CLRBREAK ) ' TxD=0
   Sleep 500
Wend
CloseHandle( hCom )
End

Y ahora el programa para leer las entradas. Si las patillas de entrada (CTS - DSR - DCD - RI) están sueltas lo interpreta como un "0". Hay que llevarlas a positivo para que se ponga las entradas que corresponda a "1". En nuestro caso, tal como está en el esquema, con 5 voltios ya conseguimos un "1" lógico pese a que el puerto COM usa señales de +12 y -12 voltios. Si pones una entrada a masa (GND) representa un "0" lógico.

Pines de entradas:

CDC -----> patilla 1 del DB9

DSR -----> patilla 6 del DB9

CTS -----> patilla 8 del DB9

RI ------> patilla 9 del DB9 (opcional)

Masa ----> patilla 5 del DB9

Manejo en FreeBasic de las Entradas CDC, DSR, CTS y RI* del puerto COM (USART), o el FT232xx, o el PL232xx:

* (No en todos los FTDI seriales tiene la función 'RI' integrada.)

The translation could modify the code. Use the code without translating or download the program by clicking the link above.
#Include "windows.bi"
Dim Letra As String
Dim hCom As HANDLE
Dim modemStat As Dword
Dim ComX As Integer
Screen 9
Locate 10,1: Input "Escribe solo el -numero- del puerto COM:"; ComX
' Es válido tanto para puertos reales como virtuales.
Cls
hCom = CreateFile( "\\.\COM" + Str( ComX ),_
GENERIC_READ Or GENERIC_WRITE,_
0,_
NULL,_
OPEN_EXISTING,_
0,_
NULL )
While Letra = ""
Letra=InKey()
GetCommModemStatus( hCom, @modemStat )
Locate 10,10
If modemStat And MS_CTS_ON Then Print "CTS=1 "; Else Print "CTS=0 ";
If modemStat And MS_DSR_ON Then Print "DSR=1 "; Else Print "DSR=0 ";
If modemStat And MS_RING_ON Then Print "RING=1 "; Else Print "RING=0 ";
If modemStat And MS_RLSD_ON Then Print "RLSD=1" Else Print "RLSD=0"
Print modemstat
Wend
CloseHandle( hCom )
End