| |||||||||||||||||
| |||||||||||||||||
| texto: | ||
Implementación de comunicación serial en Delphi. Con el desarrollo de la tecnología de la información moderna y el uso generalizado de las redes informáticas, la tecnología de la comunicación informática se ha vuelto cada vez más madura. Sin embargo, la comunicación en serie, como método de comunicación flexible, conveniente y confiable, sigue siendo un método de comunicación eficaz y se usa ampliamente en la industria. control. En la práctica de producción industrial, el uso de una PC para monitorear proyectos en tiempo real generalmente requiere que la PC tenga funciones como recopilación de datos, procesamiento de datos y control de generación y transmisión de señales en la interfaz de usuario. En este entorno específico, si la PC se va a conectar con las señales en tiempo real de control de procesos, se requiere operar directamente el puerto serie de la PC. Delphi lanzado por Borland es un potente lenguaje de programación de alto nivel con características visuales orientadas a objetos y es particularmente adecuado para la preparación de interfaces gráficas y programas de usuario en el entorno Windows. Mecanismo de comunicación serial basado en WIN95/NT El mecanismo del sistema operativo Windows prohíbe que las aplicaciones accedan directamente al hardware de la computadora, pero proporciona a los programadores una serie de funciones API estándar, lo que hace que la preparación de la aplicación sea más conveniente y elimina la molestia de depurar el hardware relacionado. En Windows 95/NT, el mensaje WM_COMMNOTIFY original de Windows 3. Simplemente opere en el búfer de lectura/escritura. Varias funciones de operación de comunicación en serie comúnmente utilizadas en WIN95/NT son las siguientes: CreatFile abre el puerto serie CloseHandle cierra el puerto serie SetupComm establece el tamaño del búfer de comunicación ReadFile lee la operación del puerto serie WriteFile escribe la operación del puerto serie SetCommState establece los parámetros de comunicación GetCommState obtiene parámetros de comunicación predeterminados ClearCommError borra el error del puerto serie y obtiene el estado actual Además de las funciones anteriores, a menudo se utiliza un registro importante DCB (bloque de control de dispositivos). Hay parámetros de puerto serie definibles registrados en DCB. Al configurar los parámetros del puerto serie, primero debe usar la función GetCommState para completar los valores predeterminados del sistema en el bloque de control DCB y luego configurar los valores personalizados que el usuario. quiere cambiar. Para llevar a cabo la comunicación en serie en WIN95/NT, además de comprender las funciones básicas de operación de comunicación, también debe dominar la programación multiproceso. Un subproceso es la ruta de ejecución dentro de un proceso y es la entidad básica utilizada por el sistema operativo para asignar tiempo de CPU. Cada proceso comienza con un único hilo para completar la ejecución de la aplicación. La comunicación en serie debe implementarse utilizando tecnología de subprocesos múltiples. Su lógica de procesamiento principal se puede expresar de la siguiente manera: al comienzo del proceso, el subproceso principal realiza algunos trabajos de inicialización necesarios y luego el subproceso principal establece un subproceso de monitoreo de comunicación para monitorear. el puerto de comunicación en el momento apropiado según sea necesario. Cuando ocurre el evento del puerto serie especificado, se envía un mensaje WM_COMMNOTIFY al hilo principal (dado que WIN95 cancela el mensaje WM_COMMNOTIFY, debe crearlo usted mismo) y el hilo principal lo procesa. Si el mensaje WM_COMMNOTIFY no es necesario, el hilo principal finaliza el hilo de monitoreo de comunicación. La ejecución simultánea de varios subprocesos provocará conflictos en los recursos compartidos. Para evitar conflictos, es necesario utilizar subprocesos múltiples sincronizados para acceder a recursos compartidos. WIN95 proporciona muchos métodos para mantener la sincronización de subprocesos. El autor utiliza la creación de objetos de eventos para mantener la sincronización de subprocesos. Cree un objeto de evento a través de CraeteEvent() y configure el objeto de evento para señalar la sincronización usando la función etEvent() o PulseEvent(). En la aplicación, utilice la función WaitSingleObject() para esperar el activador de sincronización y espere hasta que otros subprocesos configuren el evento especificado para que tenga una señal antes de continuar ejecutando el programa. Método de implementación específico en Delphi Las poderosas funciones de Delphi y la tecnología de programación orientada a objetos que admite subprocesos múltiples hacen que la comunicación en serie sea muy simple y conveniente. Se implementa llamando a funciones API externas. Los pasos principales son los siguientes: primero, use la función CreateFile para abrir el puerto serie para determinar la propiedad del puerto serie por parte de esta aplicación y, en segundo lugar, bloquear otras aplicaciones para que no operen el puerto serie; , llene el bloque de control del dispositivo DCB a través de la función GetCommState y luego configure la velocidad en baudios, los bits de datos, los bits de paridad y los bits de parada del puerto serie llamando a la función SetCommState. Luego, cree un hilo de monitoreo del puerto serie para monitorear los eventos del puerto serie. Sobre esta base, puede operar la transmisión de datos en el puerto serie correspondiente; finalmente, utilice la función CloseHandle para cerrar el puerto serie. El programa específico es el siguiente. Este programa fue compilado con Delphi3.0 y depurado en el entorno Win95. Se ha puesto en aplicación práctica para referencia de los lectores. programa: unidad comdemou; interfaz usos Windows, Mensajes, SysUtils, Clases, Gráficos, Controles, Formularios, Diálogos; constante Wm_commNotify=Wm_User+12; tipo TForm1 = clase(TForm) Procedimiento FormCreate(Remitente: TObject); privado Comminicializar el procedimiento; Procedimiento MsgcommProcess (Mensaje Var: Mensaje Tmessage Wm_commnotify); {Declaraciones privadas} público {Declaraciones públicas} fin; //Declaración de hilo TComm=Clase(TTilo) protegido procedimiento Ejecutar; anular; fin; var Formulario1: TForm1; hcom,Post_Event:Thandle; lpol: superpuestos; implementación {$R *.DFM} Procedimiento TComm.Execute; //Proceso de ejecución del hilo var dwEvtMask:DPalabra; Espere: booleano; Comenzar fillchar(lpol,sizeof(superpuesto),0); Si bien es cierto, comienza dwEvtMask:=0; Esperar:=WaitCommEvent(hcom,dwevtmask,lpol); //Esperar eventos del puerto serie; si espera, entonces comienza waitforsingleobject(post_event,infinite); //Espera a que se establezca el evento de sincronización; resetevent(post_event); //Restablecimiento del evento de sincronización; PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);//Enviar mensaje; fin; fin; fin; procedimiento Tform1.comminitialize //Inicialización del puerto serie var lpdcb:Tdcb; Comenzar hcom:=createfile('com2',generic_read o generic_write,0,nil,open_existing, file_attribute_normal o file_flag_overlapped,0);//Abre el puerto serie si hcom=invalid_handle_value entonces demás setupcomm(hcom,4096,4096); //Establece los buffers de entrada y salida en 4096 bytes getcommstate(hcom,lpdcb); //Obtiene la configuración predeterminada actual del puerto serie lpdcb.baudrate:=2400; lpdcb.StopBits:=1; lpdcb.ByteTamaño:=8; lpdcb.Parity:=EvenParity; //Paridad par Setcommstate(hcom,lpdcb); setcommMask(hcom,ev_rxchar); //Especifique el evento del puerto serie como caracteres recibidos; fin; Procedimiento TForm1.MsgcommProcess(Var Mensaje:Tmessage); var Claro: booleano; Comunicaciones: Tcomstat; cbNum,ReadNumber,lpErrors:Entero; Read_Buffer:matriz[1..100]de caracteres; Comenzar Borrar:=Clearcommerror(hcom,lpErrors,@Coms); si está claro, entonces comience cbNum:=Coms.cbInQue; ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol); //Procesar los datos recibidos SetEvent(Post_Event); //Configuración del evento de sincronización fin; fin; procedimiento TForm1.FormCreate(Remitente: TObject); comenzar comunitarizar; post_event:=CreateEvent(nil,true,true,nil); //Crea un evento de sincronización; Tcomm.Create(False); //Crea un hilo de monitoreo del puerto serie; fin; fin. Nombre del miembro autor: ruan_bangqiu | ||