Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-02-2008
emeceuy emeceuy is offline
Miembro
 
Registrado: Jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 16
emeceuy Va por buen camino
procedimiento "largo", con envio y recepcion serial

hola, bueno les comento... tengo que desarrollar una aplicación que realiza un chequeo de un dispositivo por el puerto serial rs232, enviando y recibiando datos...
el tema es que el chequeo lleva varios pasos y la verdad que nunca se me había planteado hacer algo así... he trabajado con el paralelo, pero en ese caso los datos los leo cuando quiero... en el caso del serial los datos vienen cuando ellos quieren ! je... y los recibo a través del evenco on RXChar del componente del puerto...

como hago el programa? supongamos que pongo un botón, luego envio un comando luego tendría que esperar a que llegue la respuesta y enviar otro comando y esperar la respuesta, y quizas esperar un par de segundos y volver a enviar otro comando y así sucesivamente...

como hago las demoras? con sleep? eso no me tranca la recepción? y como hago para que luego que pulsé el botón el progrma no quede solamente en ese evento y no se lo pueda detener? (no se si me explico, pero sería un procedimiento de varios segundos y si quiero detenerlo de esa manera no podría)...

la verdad que no tengo claro como puedo hacer... alguna sugerencia?

muchisimas gracias desde ya como siempre,

salu2 ! mArCe
__________________
Marcelo C.
Responder Con Cita
  #2  
Antiguo 28-02-2008
Avatar de poliburro
[poliburro] poliburro is offline
Miembro Premium
 
Registrado: Aug 2004
Ubicación: México D.F
Posts: 3.068
Poder: 17
poliburro Va por buen camino
Existe un componente, Mi preferido por cierto, para trabajar con el puerto serie. Y que te proporciona Eventos Para la lectura de datos y escritura.

TComPort.

Es una excelente opción, lo he utilizado para leer o escribir desde un lector de tarjetas hasta una interfaz para básculas industriales.


Suerte
__________________
Conoce mi blog http://www.edgartec.com
Responder Con Cita
  #3  
Antiguo 28-02-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: Aug 2007
Ubicación: Barcelona, España
Posts: 1.498
Poder: 13
duilioisola Tiene un aura espectacularduilioisola Tiene un aura espectacular
Para el tema de interrumpir:

Yo pongo una variable global booleana.
Un botón que al ser presionado poner la variable a True.
Todo el procedimiento de envío/recepcion deberá estar dentro de un while que chequee esta variable.

Código Delphi [-]
var
  interrumpir : boolean;

procedure TFMMain.BInterrumpirClick(Sender: TObject);
begin 
   interrumpir := True;
end;

procedure TFMMain.BLecturaEscrituraClick(Sender: TObject);
begin 
   interrumpir := False;
   while (not interrumpir) and (not TermioLecturaEscritura) do
   begin
      {Hacer lo que hay que hacer}
   end;
end;
Responder Con Cita
  #4  
Antiguo 28-02-2008
[FGarcia] FGarcia is offline
Miembro Premium
 
Registrado: Sep 2005
Ubicación: Cordoba, Veracruz, México
Posts: 1.123
Poder: 14
FGarcia Va por buen camino
Hola!
Por el nombre del evento supongo que usas el Componente TComPort de la biblioteca CPortLib de Djan Cernilla.
El evento RxChar te permite capturar todo lo que entre por el puerto serie caracter a caracter por lo que tu tendrias que evaluar cuantos caracteres crees que vas a recibir o si esperas un caracter en especial interceptarlo y ejecutar un procedimiento o funcion.

Código Delphi [-]
procedure TMiForm.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Cadena: string;
begin
  Cadena := '';
  {AQUI EL COMPONENTE LEE LO QUE RECIBE POR EL PUERTO COM}
  ComPort.ReadStr(Str, Count);
  
  {Aqui copiamos lo capturado.}
  
  //POR EJEMPLO EN UNA VARIABLE
  Cadena := Cadena + Str;
  
  //POR EJEMPLO EN UN MEMO
  Memo.Text := Memo.Text + Str;  }
end;

Sin embargo si conoces las caracteristicas de lo que vas a capturar, por ejemplo su longitud o un caracter terminador en especial es mejor usar el componente ComDataPacket el cual te permite capturar datos que entran como paquetes de longitud fija o limitados por un caracter de inicio y final. por ejemplo:

Cita:
LONGITUD FIJA:

+ 12.3 //9 CARACTERES
CLUB DELPHI //11 CARACTERES

LIMITADOS POR UNO O DOS CARACTERES

- 12.3<CR> //LIMITADO POR EL CARACTER ASCII CR (Carriage Return)
<STX>- 12.3<ETX> //LIMITADO POR CARACTER DE INICIO Y FINAL ASCII STX (Start of Transmition) y ETX (End OF Transmition)
Ambos RxChar y ComDataPacket son excluyentes, es decir que usas uno u otro pero no ambos.
En el ComDataPacket si usas una longitud de cadena fija y usas un caracter limitador final lo que ocurra primero determinara la ejecucion del mismo. Por ejemplo:

Cita:
- 12.3KGM<CR> //LIMITADO POR EL CARACTER ASCII CR (Carriage Return)

ComDataPacket.Length := 8;
ComDataPacket.StopString := #10;
Aqui el evento OnPacket se dispara cuando llegan los primeros 8 caracteres por lo que si te interesaba los otros 3 esos no se capturan.
Espero te sirvan estos comentarios para tus desarrollos.
Responder Con Cita
  #5  
Antiguo 29-02-2008
emeceuy emeceuy is offline
Miembro
 
Registrado: Jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 16
emeceuy Va por buen camino
hola ! muchas gracias por las respuestas... efectivamente uso ese componente y está muy bueno, y hago algo similar a lo que plantean, el tema es que mi pregunta apuntaba más a como lograr eso dentro de un procedimiento... ejemplo:
Código Delphi [-]
procedure MiProcedure;
begin
{ 1. envio un comando }
{ 2. recibo respuesta }
{ 3. envio otro comando }
{ 4. recibo respuesta, etc, etc... }
end;

el tema es que si hago eso dentro de un procedimiento ("miprocedure"), comienzo enviando el comando, si verifico si hay respuesta (el estado de "cadena" como tu primer ejemplo FGarcia) inmediatamente seguramente todavía no haya llegado nada... o sea, tendría que poner demoras tipo sleep en el medio? y ahí como hago si quiero detener el procedimiento?, no se... y el evento de recepcion de caracteres del TComPort se dispara en forma simultanea a "miprocedure" o se detiene "miprocedure" captura la info del puerto y despues sigue?

muchas gracias a todos !!! salu2
__________________
Marcelo C.
Responder Con Cita
  #6  
Antiguo 29-02-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: Aug 2007
Ubicación: Barcelona, España
Posts: 1.498
Poder: 13
duilioisola Tiene un aura espectacularduilioisola Tiene un aura espectacular
Si haces todo en un mismo procedimiento podrías hacerlo de esta manera:

Código Delphi [-]
procedure MiProcedure;
begin
{ 1. envio un comando }
   while (StringRecibido='') do ; {queda dentro del while hasta que recibe algo}
{ 2. recibo respuesta }
{ 3. envio otro comando }
   while (StringRecibido='') do ; {queda dentro del while hasta que recibe algo}
{ 4. recibo respuesta, etc, etc... }
end;
Responder Con Cita
  #7  
Antiguo 29-02-2008
emeceuy emeceuy is offline
Miembro
 
Registrado: Jun 2003
Ubicación: Uruguay
Posts: 122
Poder: 16
emeceuy Va por buen camino
ah si ! esa es una buena idea voy a probarla, el tema es que se me ocurre que mientras esté dentro de los whileo o dentro del procedure el programa va a quedar como bloqueado, quiero decir que no se va a refrescar el form ni voy a poder salir del procedimiento si quiero...

para eso puedo agregar dentro del while aplication.processmessage y así segurmanente pueda refrescar, etc, el tema es que si pongo el aplication.processmessage dentro de una funcion (en otra unit por ejemplo) me dice el error como que no sabe que es aplication... como lo soluciono?

salu2 y gracias
__________________
Marcelo C.
Responder Con Cita
  #8  
Antiguo 29-02-2008
[egostar] egostar is offline
Registrado
 
Registrado: Feb 2006
Posts: 6.422
Poder: 19
egostar Va por buen camino
Cita:
Empezado por emeceuy Ver Mensaje
ah si ! esa es una buena idea voy a probarla, el tema es que se me ocurre que mientras esté dentro de los whileo o dentro del procedure el programa va a quedar como bloqueado, quiero decir que no se va a refrescar el form ni voy a poder salir del procedimiento si quiero...

para eso puedo agregar dentro del while aplication.processmessage y así segurmanente pueda refrescar, etc, el tema es que si pongo el aplication.processmessage dentro de una funcion (en otra unit por ejemplo) me dice el error como que no sabe que es aplication... como lo soluciono?

salu2 y gracias
Bueno, desde donde yo lo veo, no deberías de tener problemas de que la aplicación se congele, todo parte de un primer envio que será por lo que comentas manual, a partir de ahí es un protocolo de comunicación que debe ser automático, es decir, terminará hasta que dejen de enviarse datos.

Te pongo un ejemplo

1. Dispositivo1 Envia Cadena(MANUAL) a Dispositivo2
2. Dispositivo2 Envia Cadena(AUTO) a Dispositivo1
3. Se verifica la cadena recibida
4. Es fin de Proceso (GOTO paso 6)
5. Dispositivo1 envia cadena(AUTO) a Dispositivo2 (GOTO Paso 2)
6. Terminar proceso

, Me parece código tipo VB,

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #9  
Antiguo 26-03-2008
JoseFco JoseFco is offline
Baneado
 
Registrado: Dec 2007
Posts: 1.861
Poder: 0
JoseFco cantidad desconocida en este momento
Hola amigos.

Comentado por FGarcia.
Cita:
Ambos RxChar y ComDataPacket son excluyentes, es decir que usas uno u otro pero no ambos.
En el ComDataPacket si usas una longitud de cadena fija y usas un caracter limitador final lo que ocurra primero determinara la ejecucion del mismo. Por ejemplo:
La pregunta mia es la siguiente: En un mismo programa no puedo usar ambos?

Un Saludo.
Responder Con Cita
  #10  
Antiguo 28-06-2008
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: May 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 12
richy08 Va por buen camino
Buenos dias compañeros he leido el post y me parece muy interesanta creen que este componente me pueda leer los puertos seriales com1 o com2 de un conmutador muchas gracias.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Comentario "aplastante" contra los que atacan la "piratería" Casimiro Notevi La Taberna 12 07-03-2010 14:03:02
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53
"atrapar" la ejecución de un procedimiento jorgesl Varios 2 17-04-2006 19:39:10
porque no me reconoce los caracteres "*" ni "%" cuando filtro mrmago Conexión con bases de datos 10 27-01-2006 04:21:16
"no current record for fetch operation" con procedimiento almacenado usado en Select Al González Firebird e Interbase 1 17-03-2004 21:13:17


La franja horaria es GMT +2. Ahora son las 00:34:01.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi