4D v13.4

RECEIVE PACKET

Inicio

 
4D v13.4
RECEIVE PACKET

RECEIVE PACKET 


 

RECEIVE PACKET ( {docRef ;} varRecep ; stopCar | numBytes ) 
Parámetro Tipo   Descripción
docRef  DocRef in Número de referencia del documento o canal actual (puerto serial o documento)
varRecep  Variable texto, BLOB variable in Variable para recibir datos
stopCar | numBytes  Cadena, Entero largo in Carácter(es) en el(los) cual(es) detener la recepción de datos o número de bytes a recibir

RECEIVE PACKET lee los caracteres desde un puerto serial o desde un documento.

Si se especifica docRef, el comando recupera los caracteres desde un documento abierto por la función Open document, Create document o Append document. Si se omite docRef, este comando recupera los caracteres de un puerto serial o de un documento abierto utilizando SET CHANNEL.

Sin importar la fuente, los caracteres leídos se devuelven en la variable varRecep, la cual debe ser una variable de tipo Texto, Alfa o BLOB. Si los caracteres han sido enviados por el comando RECEIVE PACKET, el tipo debe corresponder al del paquete enviado.

Notas:

  • En modo no Unicode (modo contabilidad) las variables alfa aceptan hasta 255 caracteres y tienen un tamaño fijo y las variables tipo Texto no tienen un tamaño fijo y pueden aceptar 32 000 caracteres.
  • Cuando el paquete recibido es de tipo BLOB, el comando no tiene en cuenta ningún conjunto de caracteres definido por el comando USE CHARACTER SET. Se devuelve el BLOB sin ninguna modificación.
  • Cuando el paquete recibido es de tipo texto, el comando RECEIVE PACKET soporta Byte Order Marks (BOMs). En este caso, si el conjunto de caracteres actual es de tipo Unicode (UTF-8, UTF-16 o UTF-32), 4D intenta identificar un BOM entre los primeros bytes recibidos. Si detecta uno, lo filtra de la variable recepVar y 4D utiliza el conjunto de caracteres definido en lugar del conjunto de caracteres actual.

Para recibir un número predefinido de caracteres, pase este número en el parámetro numBytes. Si la variable recepVar es de tipo Texto, en una sola llamada puede leer hasta 2 GB de texto en modo Unicode (valor teórico) o 32 000 caracteres en modo no Unicode (en este caso, para especificar el número máximo de caracteres, puede pasar la constante MAXTEXTLENBEFOREV11 en numBytes.

Nota de compatibilidad: en versiones  de 4D  anteriores a la versión 11, las bases trabajan generalmente con el conjunto de caracteres ASCII (mac-roman), en el cual cada carácter es codificado en un byte (8 bits). El parámetro numBytes indica directamente el número de caracteres a recibir. A partir de la versión 11, las bases trabajan en modo Unicode (conjunto de caracteres UTF-8 por defecto). En este modo, algunos caracteres se codifican en 2 bytes, como por ejemplo los caracteres acentuados. La correspondencia entre el número de caracteres/número de bytes puede variar. En este caso, para controlar el número de caracteres recibidos, es preferible definir un conjunto de caracteres del tipo mac-roman vía el comando USE CHARACTER SET, que utilizar los BLOBs o utilizar el parámetro stopCar.  

Para leer caracteres hasta que encuentre una cadena particular (compuesta de uno o más caracteres), pase esta cadena en stopCar (la cadena no se devuelve en varRecep).

En este caso, si no se encuentra el carácter cadena especificado por stopCar:

  • Cuando RECEIVE PACKET lee datos en un documento, se detendrá la lectura al final del documento.
  • Cuando RECEIVE PACKET lee datos de un puerto serial, el comando se ejecutará indefinidamente hasta que el timeout (si hay) haya pasado (ver SET TIMEOUT) o hasta que el usuario interrumpa la recepción (ver a continuación).

Durante la ejecución de RECEIVE PACKET, el usuario puede interrumpir la recepción presionando Ctrl-Alt-Mayús (Windows) o Comando-Opción-Mayús (Macintosh). Esta interrupción genera un error -9994 que puede interceptar con un método instalado utilizando ON ERR CALL. Generalmente, sólo tendrá que administrar la interrupción de una recepción en el momento de una comunicación sobre un puerto serial.

Durante la lectura de un documento, el primer RECEIVE PACKET comienza por leer el principio del documento. La lectura de cada paquete subsiguiente comienza con el carácter después del último carácter leído.

Nota: este comando es útil con un documento abierto con SET CHANNEL. Por el contrario, para un documento abierto con Open document, Create document y Append document, puede utilizar los comandos Get document position y SET DOCUMENT POSITION para obtener y cambiar la ubicación en el documento donde ocurrirá la próxima escritura (SEND PACKET) o lectura (RECEIVE PACKET).

Cuando intente leer después del final de un archivo RECEIVE PACKET devuelve los datos leídos hasta ese punto y la variable OK tomará el valor 1. Luego, el siguiente RECEIVE PACKET devolverá una cadena vacía y la variable OK tomará el valor cero.

Nota: en modo no Unicode (compatibilidad) cuando utiliza el comando RECEIVE PACKET para leer caracteres de un documento Windows y no quiere utilizar mapas ASCII para convertir los caracteres Windows en caracteres Mac OS, puede utilizar la función Win to Mac.

El siguiente ejemplo lee 20 caracteres de un puerto serial en la variable recupVeinte:

 RECEIVE PACKET(recupVeinte;20)

El siguiente ejemplo lee datos del documento referenciado por la variable miDoc en la variable vData. El comando lee hasta que encuentra un retorno de carro:

 RECEIVE PACKET(miDoc;vData;Char(Carriage return))

El siguiente ejemplo lee datos desde el documento referenciado por la variable miDoc en la variable vData. El comando lee hasta que encuentra una etiqueta HTML de fin de tabla </TD>:

 RECEIVE PACKET(miDoc;vData;"</TD>")

El siguiente ejemplo lee datos de un documento y los pone en campos. Los datos se almacenan como campos de longitud fija. El método llama a una subrutina para eliminar espacios (espacios al final de la cadena). La subrutina sigue el método:

 $vhDocRef :=Open document("";"TEXT") ` Apertura de un documento de tipo TEXTO
 If(OK=1) ` Si el documento está abierto
    Repeat ` Bucle hasta que no haya más datos
       RECEIVE PACKET($vhDocRef;$Var1;15) ` Lectura de 15 caracteres
       RECEIVE PACKET($vhDocRef;$Var2;15) ` Hace lo mismo para el segundo campo
       If(($Var1#"")|($Var2#"")) ` Si por lo menos uno de los campos no está vacío
          CREATE RECORD([Personas]) ` Crear un nuevo registro
          [Personas]Nombre:=Strip($Var1` Guardar el nombre
          [Personas]Apellido:=Strip($Var2` Guardar el apellido
          SAVE RECORD([Personas]) ` Guardar el registro
       End if
    Until(OK=0)
    CLOSE DOCUMENT($vhDocRef` Cierre del documento
 End if

Los espacios al final de los datos son eliminados por el siguiente método, llamado Elimina:

 For($i;Length($1);1;-1) ` Bucle desde el final de la cadena al inicio
    If($1$i≥#" ") ` Si no es un espacio…
       $i :=-$i  ` Forzar el bucle a detenerse
    End if
 End for
 $0:=Delete string($1;-$i;Length($1)) ` Borrar los espacios

Después de un llamado a RECEIVE PACKET, la variable sistema OK toma el valor 1 si el paquete se recibe sin errores. De lo contrario, la variable sistema OK toma el valor 0.

 
PROPIEDADES 

Producto: 4D
Tema: Comunicaciones
Número 104

Este comando modifica la variable sistema OKEl modo Unicode afecta este comando

 
INDEX

Lista alfabética de los comandos

 
HISTORIA 

Modificado: 4D v11 SQL
Modificado: 4D v12

 
VER TAMBIÉN 

Get document position
RECEIVE BUFFER
SEND PACKET
SET DOCUMENT POSITION
SET TIMEOUT
USE CHARACTER SET

 
PALABRAS CLAVES 

BOM***