Cómo transmitir y recibir datos binarios mediante el control de MSComm32 de VFP


Resumen


En este artículo se muestran algunas técnicas que usan el control Visual FoxPro 3,0 Communications (MSComm) para recibir y transmitir datos binarios a través de un cable RS-232 (sin módems).

Más información


El control de comunicaciones MSCOMM32. OCX, proporciona comunicaciones en serie para la aplicación permitiendo la transmisión y recepción de datos a través de un puerto serie en el que solo se permite una cadena de caracteres para el búfer de transmisión. Esta característica le limita a transmitir archivos basados en texto. En este artículo se muestra cómo usar el control MSComm para transmitir y recibir datos binarios con el cable RS-232. (Las técnicas de este artículo también funcionan con los módems). Los datos binarios deben convertirse un byte a la vez en un carácter y, a continuación, transmitirse. Cuando se recibe, los datos se deben convertir de un carácter a datos binarios de un byte cada vez. En los sistemas operativos habilitados para DBCS (con software de sistema operativo en ejecución que usa uno de los conjuntos de caracteres de dos bytes), los datos binarios se dañarán si uno de los valores binarios coincide con un carácter inicial de DBCS. El control MSComm interpretará este byte y el siguiente como un carácter de doble byte y devolverá solo un byte para el carácter ASCII equivalente. Para resolver este problema, debe convertir un byte en un tamaño ASCII de tres caracteres para conservar el carácter inicial.

Código de ejemplo

En el código siguiente se muestra este proceso.Advertencia EL USO DEL CÓDIGO DE EJEMPLO PROPORCIONADO EN ESTE ARTÍCULO ESTÁ BAJO SU PROPIA RESPONSABILIDAD. Microsoft proporciona este código de ejemplo "tal cual" sin garantías de ningún tipo, ya sean expresas o implícitas, incluyendo, entre otras, las garantías implícitas de comerciabilidad o idoneidad para un fin determinado.
* Transmitter Code.* INIT event of Comm OLE control* 28800 baud, no parity, 8 data, and 1 stop bit.* In RS-232, maximum speed of 28800 baud can be used   This.Settings = "28800,N,8,1"   This.InputLen = 1   This.CommPort = 1   This.PortOpen = .T.* ONCOMM event of Comm OLE Control* The following code is needed to make sure that next set of characters* can be transmitted (CommEvent = 2 is triggered from the receiver side)   IF This.CommEvent = 2      This.input       IF gnTop <= gnEnd         gcString = FREAD(gnFileHandle, 1)  && Store to memory         q=asc(gcstring)         * change ASCII to character (size of 3) to preserve the lead char    thisform.olecontrol1.output = str(q,3)    gnTop = gnTop + 1       ENDIF   ENDIF* INIT event of form   PUBLIC gnFileHandle   PUBLIC gnEnd   PUBLIC gnTop   PUBLIC q   * You should replace 'c:\sample.hlp' with your own binary file   STORE FOPEN('c:\sample.hlp') TO gnFileHandle    && Open the file   STORE FSEEK(gnFileHandle, 0, 2) TO gnEnd  && Move pointer to EOF   STORE FSEEK(gnFileHandle, 0) TO gnTop  && Move pointer to BOF   gntop=1   q=""-----------------------Property of OleControl1RThreshold = 1     * triggers when at least one char is on the bufferSThreshold = 3-----------------------* Receiver Code.* INIT event of OleControl1* 28800 baud, no parity, 8 data, and 1 stop bit.   This.Settings = "28800,N,8,1"   This.InputLen = 3   This.CommPort = 1   This.PortOpen = .T.* OnComm event   IF This.CommEvent = 2 AND This.InBufferCount > 0      qq=CHR(VAL(This.Input))      =FWRITE(gnFileHandle,qq)      this.output = CHR(26)   ENDIF* INIT event of form   PUBLIC gnFileHandle   * You should replace 'c:\sample.hlp' with your own file name   IF FILE('c:\sample.hlp')  && Does file exist?      gnErrFile = FOPEN('c:\sample.hlp',12)  && If so, open read-write   ELSE      gnErrFile = FCREATE('c:\sample.hlp')  && If not, create it   ENDIF   = FCLOSE(gnErrFile)  && Close the file   STORE FOPEN('c:\sample.hlp',1) TO gnFileHandle     && Open the file* CLICK event of button   *This tells the transmitting side to start sending the file   Thisform.Olecontrol1.output = CHR(26)-----------------------Property of OleControl1RThreshold = 3-----------------------
La técnica controlada por eventos genera un evento de "com" cuando hay caracteres que esperan en el búfer de entrada. Además, la propiedad CommEvent contendrá un valor numérico de 2. Para que el evento de datacomm se desencadene, debe establecer la propiedad Rthreshold en un valor distinto de cero (valor predeterminado). La configuración más común para la propiedad RThreshold es 1, lo que significa que el evento datacomm se desencadena si un mínimo de un carácter está esperando en el búfer de entrada. En este artículo, 3 se está utilizando como valor de la propiedad RThreshold porque se están enviando tres caracteres a la vez.