Delphi es una herramienta visual de desarrollo rápido de aplicaciones con las ventajas de funciones potentes, facilidad de uso y ejecución rápida de código. Desempeña un papel cada vez más importante en la creación de sistemas de información empresarial. Muchos programadores están dispuestos a elegir Delphi como herramienta de desarrollo. . Sin embargo, el problema es que Delphi no tiene su propio control de comunicación en serie y no se menciona la comunicación en serie en su documentación de ayuda, lo que genera muchos inconvenientes para los desarrolladores que compilan programas de comunicación.
Actualmente, existen tres métodos comúnmente utilizados para implementar la comunicación en serie usando Delphi: uno es usar controles, como el control MSCOMM y el control SPCOMM; el otro es usar funciones API; el tercero es llamar a otros programas de comunicación en serie; Entre ellos, usar API para escribir programas de comunicación en serie es más complicado y requiere muchos conocimientos de comunicación. En comparación, es relativamente simple usar el control SPCOMM, y el control tiene ricas propiedades y eventos estrechamente relacionados con la comunicación del puerto serie, proporciona varias operaciones en el puerto serie y también admite subprocesos múltiples. El siguiente artículo presenta el uso del control SPCOMM en detalle con ejemplos.
Instalación SPCOMM
1. Seleccione la opción Instalar componente en el menú desplegable Componente, complete la ruta donde se encuentra el control SPCOMM en el nombre del archivo de la Unidad, los valores predeterminados se pueden usar para otros elementos y haga clic en el botón Aceptar.
2. Después de la instalación, aparecerá un COM de control rojo en el panel de control del sistema. Ahora puede utilizar controles COM tal como los propios controles de Delphi.
Propiedades, métodos y eventos de SPCOMM
1.Atributos
●CommName: Indica los nombres de los puertos serie como COM1 y COM2;
●BaudRate: La velocidad en baudios establecida según las necesidades reales. Este valor también se puede cambiar después de abrir el puerto serie, y la velocidad en baudios real cambiará en consecuencia;
●ParityCheck: Indica si se requiere verificación de paridad;
●ByteSize: la longitud del byte establecida según la situación real;
●Paridad: bit de paridad;
●StopBits: bits de parada;
●SendDataEmpty: Este es un atributo booleano. Cuando es verdadero, significa que el búfer de envío está vacío o no hay información en la cola de envío; cuando es falso, significa que el búfer de envío no está vacío o no. hay información en la cola de envío.
2. método
●El método Startcomm se utiliza para abrir el puerto serie. Cuando la apertura falla, generalmente se informa un error. Hay siete tipos principales de errores: ⑴ Se ha abierto el puerto serie; ⑵ Error al abrir el puerto serie; ⑶ El identificador del archivo no es un identificador de comunicación; ⑹ No se puede instalar el caché de comunicación; No se puede generar el proceso de lectura; ⑺ No se puede generar el proceso de escritura;
●El método StopComm se utiliza para cerrar el puerto serie y no tiene valor de retorno;
El método WriteCommData(pDataToWrite: PChar;dwSizeofDataToWrite:Word) es una función con un valor de retorno booleano. Se utiliza para enviar una cadena al proceso de escritura. Devuelve verdadero si el envío es exitoso y falso si el envío falla. La ejecución de esta función obtendrá el valor de retorno inmediatamente y la operación de envío se ejecutará posteriormente. Esta función tiene dos parámetros, donde pDataToWrite es la cadena que se enviará y dwSizeofDataToWrite es la longitud de la cadena que se enviará.
3. evento
●OnReceiveData:Procedimiento (Remitente: TObject;Buffer: Puntero;BufferLength: Word) del objeto
Este evento se activará cuando se ingresen datos al búfer, donde se pueden procesar los datos recibidos desde el puerto serie. El búfer contiene los datos recibidos y BufferLength es la longitud de los datos recibidos.
●OnReceiveError: procedimiento (Remitente: TObject; Máscara de evento: DWORD)
Este evento se activa cuando hay un error al recibir datos.
Uso de SPCOMM
El siguiente es un ejemplo de comunicación serial usando el control SPCOMM.
Tomando como ejemplo la comunicación entre la PC y el microcontrolador 8051, primero debemos ajustar la señal de protocolo de enlace entre ellos. Supongamos que el protocolo de comunicación entre ellos es: un cuadro de datos de la PC a 8051 tiene 6 bytes y un cuadro de datos de 8051 a la PC también tiene 6 bytes. Cuando la PC envía (F0,01,FF,FF,01,F0), 8051 puede recibir una trama (F0,01,FF,FF,01,F0), lo que indica que el protocolo de enlace de comunicación de datos fue exitoso y los dos pueden seguir Los protocolos se transfieren datos entre sí.
Cree un nuevo proyecto COMM.DPR, establezca la propiedad NOMBRE del formulario en FCOMM, defina el título del formulario como Comunicación de prueba y agregue los controles correspondientes.
1. Establezca los atributos COMM1:
●Velocidad de baudios: 4800;
●Bit de paridad: Ninguno;
●Longitud del byte: 8;
●Bit de parada: 1;
●Puerto serie: COM1.
Los datos enviados y recibidos se mostrarán en Memo1. Guarde el nuevo formulario como Comm.pas.
2.Escribir código fuente
//Descripción de la variable
var
fcomm:TFCOMM;
cadena de visualización:cadena;
yo: entero;
rbuf,sbuf:matriz[16] de bytes;
//abrir puerto serie
procedimiento TFCOMM.FormShow(Remitente: TObject);
comenzar
comm1.StartComm;
fin;
//Cierra el puerto serie
procedimiento TFCOMM.FormClose(Remitente: TObject; var Acción: TCloseAction);
comenzar
comm1.StopComm;
fin;
//Personaliza el proceso de envío de datos
procedimiento de envío de datos;
var
yo: entero;
comunicación:booleano;
comenzar
cadena de visualización:='';
comunicación:=verdadero;
para i:=1 a 6 hacer
comenzar
si no es fcomm.comm1.writecommdata(@sbuf[i],1) entonces
comenzar
comunicación:=falso;
romper;
fin;
//Retraso entre bytes al enviar
dormir(2);
cadena de vista:=cadena de vista+intttohex(sbuf[i],2)+'';
cadena de vista:='Enviar'+cadena de vista;
fcomm.memo1.lines.add(cadena de vista);
fcomm.memo1.lines.add('');
si no se comunica, entonces messagedlg('¡Error en el envío!',mterror,[mbyes],0);
fin;
//Enviar evento de clic en el botón
procedimiento TFCOMM.Btn_sendClick (Remitente: TObject);
comenzar
sbuf[1]:=byte($ f0); //Encabezado del marco
sbuf[2]:=byte($ 01); //Número de comando
sbuf[3]:=byte($ff);
sbuf[4]:=byte($ff);
sbuf[5]:=byte($ 01);
sbuf[6]:=byte($ f0); //Fin del cuadro
senddata;//Llamar a la función de envío
fin;
//proceso de recepción
procedimiento TFCOMM.Comm1ReceiveData(Remitente: TObject; Buffer: Puntero;BufferLength: Word);
var
yo: entero;
comenzar
cadena de visualización:='';
mover(búfer^,pchar(@rbuf^),longitud del búfer);
para i:=1 a bufferlength hacer
cadena de vista:=cadena de vista+intttohex(rbuf[i],2)+'';
cadena de vista:='recibir'+cadena de vista;
memo1.lines.add(cadena de vista);
memo1.lines.add('');
fin;
Si memo1 muestra enviando F0 01 FF FF 01 F0 y recibiendo F0 01 FF FF 01 F0, esto significa que el puerto serie envió datos correctamente y recibió datos correctamente, y la comunicación serie es exitosa.