Identificación de Puertos Seriales en FoxPro
La detección de puertos seriales es una funcionalidad importante para los desarrolladores que trabajan con protocolos de comunicación en aplicaciones que involucran dispositivos externos como lectores de código de barras, modems y otros aparatos que utilizan la conexión serial para la transmisión de datos. El lenguaje de programación FoxPro, a pesar de su antigüedad, todavía es utilizado por muchos programadores para el desarrollo de sistemas de gestión y soluciones empresariales que requieren de esta integración con hardware específico.
Para localizar y trabajar con puertos seriales en FoxPro, es esencial tener un dominio del manejo de las APIs del sistema operativo Windows, que a su vez requieren una base sólida de conocimiento de las estructuras y llamadas de sistema en el código. A continuación, presentaremos diversas técnicas que permitirán identificar los puertos COM disponibles en el equipo.
Uso de la API de Windows
El sistema operativo Windows provee una serie de APIs que pueden ser utilizadas para obtener información de los dispositivos conectados a la PC, incluyendo los puertos seriales. A través de FoxPro, es posible invocar estas APIs para identificar los puertos disponibles. Para hacer esto se emplea la función DECLARE, que permite la utilización de funciones externas contenidas en archivos DLL.
* Declara la función para obtener el nombre del puerto
DECLARE INTEGER QueryDosDevice IN winbase;
Luego de la declaración, podemos llamar a la función QueryDosDevice pasando null como argumento para recibir la lista de todos los dispositivos, y luego procesar esa lista para extraer específicamente los puertos COM. El código de ejemplo mostrado a continuación establece el proceso completo para la detección:
* Configura los parámetros para QueryDosDevice
nBufferLength = 1024
cBuffer = SPACE(nBufferLength)
= QueryDosDevice(NULL, @cBuffer, nBufferLength)
* Procesa la respuesta para listar los puertos
cDeviceList = STRTRAN(cBuffer, CHR(0), CHR(13))
FOR EACH cDevice IN STRSPLIT(cDeviceList, CHR(13))
IF LEFT(cDevice, 3) == "COM"
? "Puerto serial encontrado: " + cDevice
ENDIF
ENDFOR
Interacción con el Registro de Windows
Además de la API, el registro de Windows es una fuente valiosa de información de la configuración de sistema y del hardware conectado. Se puede interactuar con el registro para obtener una lista de puertos seriales a través de diversas entradas que almacenan datos de los dispositivos. Para ello, se utiliza la función RegOpenKey y RegQueryValueEx que permiten la lectura de estas entradas.
* Abre la clave del registro donde se listan los puertos
nHKey = 0
nResult = RegOpenKey(HKEY_LOCAL_MACHINE, "HARDWAREDEVICEMAPSERIALCOMM", @nHKey)
IF nResult = 0
cValueName = REPLICATE(CHR(0), 256)
nValueNameSize = LEN(cValueName)
cValue = REPLICATE(CHR(0), 256)
nValueSize = LEN(cValue)
nKeyNum = 0
DO WHILE RegQueryValueEx(nHKey, nKeyNum, @cValueName, @nValueNameSize, @cValue, @nAnswer) = 0
nKeyNum = nKeyNum + 1
? "Puerto COM disponible:", SUBSTR(cValue, 1, AT(CHR(0), cValue)-1)
cValueName = REPLICATE(CHR(0), 256)
nValueNameSize = LEN(cValueName)
cValue = REPLICATE(CHR(0), 256)
nValueSize = LEN(cValue)
ENDDO
= RegCloseKey(nHKey)
ENDIF