Leer puerto serial balanza FoxPro [SOLUCIONADO]

Cuando hablamos de integración de dispositivos en aplicaciones de escritorio, una de las tareas más comunes es la comunicación con dispositivos de medida como básculas y balanzas. Ya sea para aplicaciones de punto de venta, control de inventario o procesos industriales, es crítico implementar eficazmente la comunicación de datos de manera precisa y confiable desde la balanza hacia el sistema de gestión. En entornos donde se utiliza Visual FoxPro, lenguaje y entorno de programación clásico, esta integración puede presentar desafíos particulares debido a las diferencias tecnológicas con las prácticas actuales de programación.

El objetivo es manejar información que es capturada por la balanza de manera automática a través del puerto serie o COM en una aplicación FoxPro. Para hacer esto de forma correcta, deben establecerse protocolos para la lectura de datos de manera que la aplicación pueda procesarlos y utilizarlos según sea necesario.

**Comenzando con la conexión del puerto serie**

El primer paso es configurar y abrir el puerto serie. Esto requiere utilizar las funciones de Windows API, ya que Visual FoxPro no tiene funciones nativas para la comunicación serial. El uso de la API puede ser complicado, pero una vez establecido el código inicial, puede ser reutilizado de manera eficiente en futuros proyectos.

El siguiente fragmento de código muestra cómo abrir el puerto con los parámetros típicos para una balanza serial:

DECLARE INTEGER CreateFile IN win32api ;
    STRING lpFileName, ;
    INTEGER dwDesiredAccess, ;
    INTEGER dwShareMode, ;
    INTEGER lpSecurityAttributes, ;
    INTEGER dwCreationDisposition, ;
    INTEGER dwFlagsAndAttributes, ;
    INTEGER hTemplateFile

#DEFINE GENERIC_READ 0x80000000
#DEFINE OPEN_EXISTING 3
#DEFINE FILE_ATTRIBUTE_NORMAL 0x80

LOCAL hCom
hCom = CreateFile("COM1", GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
IF hCom=-1
    * Error al abrir el puerto serie
ELSE
    * Puerto abierto correctamente
ENDIF

Es importante establecer correctamente los parámetros de la función `CreateFile`, incluyendo el nombre del dispositivo (`COM1`, `COM2`, etc.), el modo de apertura, y los atributos del archivo. Estos parámetros permitirán que la aplicación y la balanza se “hablen” efectivamente.

Una vez abierto el puerto serie, se debe configurar de acuerdo a las especificaciones de la balanza. Por ejemplo, se debe establecer la velocidad de transmisión, los bits de paridad y stop, y si se requiere hardware o control de flujo. Esto se logra también a través de la API de Windows:

DECLARE INTEGER GetCommState IN win32api INTEGER, STRING @
DECLARE INTEGER SetCommState IN win32api INTEGER, STRING @
DECLARE INTEGER BuildCommDCB IN win32api STRING, STRING @

LOCAL nRetVal, dcb

nRetVal = GetCommState(hCom, @dcb)
IF nRetVal=0
    * Error obteniendo el estado del puerto
ELSE
    * El estado del puerto se obtuvo correctamente
    * Configurar los parámetros específicos de la balanza
    nRetVal=BuildCommDCB("baud=9600 parity=N data=8 stop=1", @dcb)
    IF nRetVal=0
        * Error configurando el puerto
    ELSE
        nRetVal=SetCommState(hCom, @dcb)
        IF nRetVal=0
            * Error aplicando la configuración al puerto
        ELSE
            * Puerto configurado correctamente
        ENDIF
    ENDIF
ENDIF

**Leyendo datos de la balanza**

Con la conexión ya establecida, el siguiente paso es la lectura de los datos que la balanza envía. Esto por lo general se realiza a través de un ciclo en el que la aplicación espera y recoge los datos que llegan por el puerto serie.

Veamos cómo se podría hacer una lectura simple de los datos:

DECLARE INTEGER ReadFile IN win32api ;
    INTEGER hFile, ;
    STRING @lpBuffer, ;
    INTEGER nNumberOfBytesToRead, ;
    INTEGER @lpNumberOfBytesRead, ;
    INTEGER lpOverlapped

LOCAL m.cBuffer, m.nBytesRead, m.nBytesToRead
m.cBuffer = SPACE(100)
m.nBytesToRead = 100

nRetVal = ReadFile(hCom, @m.cBuffer, m.nBytesToRead, @m.nBytesRead, 0)
IF nRetVal=0
    * Error leyendo el puerto
ELSE
    * Datos recibidos, proceder con su procesamiento
    * m.cBuffer contiene los datos leídos desde la balanza
ENDIF

Este es un código básico y una lectura de un solo bloque. En aplicaciones del mundo real se suelen implementar lecturas continuas o manejadas por eventos, de tal forma que la balanza pueda ser leída tan pronto como envíe nuevos datos sin bloquear la aplicación.

**Manejando los datos recibidos**

Una vez que tienes los datos, debes procesarlos para convertirlos en información útil. La balanza enviará los datos en el formato que esté programada para enviar. Esto significa que puede ser necesario un procesamiento adicional para obtener, por ejemplo, el peso neto o bruto.

Para esto, normalmente tendrás que hacer uso de las funciones de manejo de strings de FoxPro, como `LEFT()`, `RIGHT()`, `SUBSTR()`, etc., para limpiar y extraer la información relevante de los datos de entrada.

**Cerrando la comunicación con la balanza**

Cuando tu aplicación termina de comunicarse con la balanza, es fundamental cerrar la conexión con el puerto serie adecuadamente, para liberar recursos del sistema y permitir que otras aplicaciones o instancias de tu propio programa puedan utilizar el puerto sin conflictos. El cierre se efectúa llamando a la función `CloseHandle` de la API de Windows:

DECLARE INTEGER CloseHandle IN win32api INTEGER

nRetVal = CloseHandle(hCom)
IF nRetVal=0
    * Error cerrando el puerto
ELSE
    * Puerto cerrado correctamente
ENDIF

En resumen, la comunicación con una balanza a través del puerto serie en Visual FoxPro requiere una buena comprensión de la API de Windows y algo de trabajo manual para abrir, configurar, leer y cerrar la comunicación. Con el código proporcionado y las explicaciones puedes comenzar a implementar estas funcionalidades en tu próxima aplicación FoxPro, asegurando una integración efectiva con dispositivos seriales. Recuerda siempre probar extensivamente la comunicación en un ambiente controlado antes de implementarla en un entorno en producción para garantizar la robustez y confiabilidad del sistema.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad