Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-08-2005
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 22
IVAND Va por buen camino
Unhappy Ayudemos a utilizar Comport (Rs232)

Hola a todos

Estoy tratando de utilizar los componentes Comport para la captura de datos de una balanza electronica me he encontrado con una serie de problemas he revisado los ejemplos que traen estos componentes funcionan de maravilla pero aun no consigo hacer lo mismo con mis programas.

Ejemplo utilizo el ejemplo Miniterm el cual es exactamente lo que quiero hacer pero en el evento de captura si no incluto un showmessage() el valor que envia no es el correcto he estado revisando y puede ser un problema de la cadena que envia el dato (estoy leyendo un articulo que encontre a la manera de tratar cierto tipo de cadenas ).

Espero que personas con un mayor conocimiento puedan apoyar con un granito de arena al fin de poder saber todos como se deben utilizar estos o otros componetes de forma practica

En espera de sus respuesta y sabiendo de su alto sentido de ayuda y apoyo quedo muy agradecido

Nota : codigo que utilizo en la captura del dato
Código PHP:
procedure TMainForm.ComTerminalStrRecieved(SenderTObject;
  var 
StrString);
begin
  Showmessage
('Dato '+z);
  
x:=copy(Str,1,2);

  If 
x=#2',' Then   // Indica el inicio de la cadena
   
Begin
   y
:=Str;
   If 
Copy(str,17,1)=#$D Then //Indica el fin de la cadena
    
Begin
     z
:= Copy(y,3,14);
     
Edit1.Text:=z;
    
End
   
Else
   
End 
__________________
IVAND
Responder Con Cita
  #2  
Antiguo 25-08-2005
Avatar de Jobev Lee
Jobev Lee Jobev Lee is offline
Registrado
 
Registrado: jul 2005
Posts: 8
Poder: 0
Jobev Lee Va por buen camino
Colaboremonos entonces...

Bueno, te cuento una buena.. tengo alguito de experiencia haciendo software para basculas, me facilitaria de harto saber si te estas comunicando directamente con la bascula o estas usando un indicador como intermediario...

Yo he hecho la mayoria de estos software en Delphicito y el Java, pero para serte sincero, nunca use ese componente que mencionas...(commport) ... Mejor te sale hacer una cosa, create tu propia libreria de captura de datos por el puerto Serial usando las instrucciones del Window (SDK)... a continuacion te mando el codigo de la unidad que podrias usar...
Código:
unit URS232;
interface
uses
	Windows, SysUtils;
type

	TRS232=class
	private
	   hCommFile : THandle;
	   sPuerto : String;
	public
	   constructor Create(lsPuerto: String; liBanda:Cardinal;
						  liByteSize, liParidad, liBitParada:Byte);
	   function LeerBuffer: string;
	   procedure EscribirBuffer(lsMensaje:string);
	end;
implementation
{ TRS232 }
constructor TRS232.Create(lsPuerto: String; liBanda:Cardinal;
						  liByteSize, liParidad, liBitParada:Byte);
var CommTimeouts : TCommTimeouts;
	CommConfig: TCommConfig;
	sizeConfig :  Cardinal;
begin
  sPuerto := lsPuerto;
hCommFile := CreateFile(PChar(sPuerto),
						  GENERIC_READ or GENERIC_WRITE,
						  0,
						  nil,
						  OPEN_EXISTING,
						  FILE_ATTRIBUTE_NORMAL,
						  0);
with CommTimeouts do
begin
  ReadIntervalTimeout := 0;
  ReadTotalTimeoutMultiplier := 0;
  ReadTotalTimeoutConstant := 300;
  WriteTotalTimeoutMultiplier := 0;
  WriteTotalTimeoutConstant := 200;
end;
if not SetCommTimeouts(hCommFile, CommTimeouts) then
	raise Exception.Create(Problemas estableciendo CommTimeouts);

	GetCommConfig(hCommFile, CommConfig, sizeConfig);
	with CommConfig do
	begin
		dcb.BaudRate := liBanda;//9600;//38400;//<-- Se comunica a esa velocidad ????
		dcb.ByteSize := liByteSize; //8;
		dcb.Parity := liParidad;//NOPARITY; //EVENPARITY;
		dcb.StopBits := liBitParada;;
	end;
	if not SetCommConfig(hCommFile, CommConfig, sizeConfig) then
	   raise Exception.Create(Problemas al querer establecer la configuracion);
end;

procedure TRS232.EscribirBuffer(lsMensaje: string);
var NumberWritten:dword;
begin
if hCommFile = INVALID_HANDLE_VALUE then
		raise Exception.Create('No se puede enviar los datos');
		WriteFile(hCommFile,
			PChar(lsMensaje)^,
			Length(lsMensaje),
			NumberWritten,
			nil);
end;

function TRS232.LeerBuffer: string;
var sTmp:string;
	c1:integer;
	chBuffer:array[0..255] of char;
	NumberOfBytesRead : dword;
begin
if hCommFile=INVALID_HANDLE_VALUE then exit;
if not ReadFile (hCommFile, chBuffer, sizeof(chBuffer),
			  NumberOfBytesRead, Nil) then
	raise Exception.Create('Imposible leer datos desde el puerto');
for c1:= 0 to NumberOfBytesRead - 1 do
	  sTmp:= sTmp+chBuffer[c1];
result:=sTmp;
end;
end.
...ahora, para mejor uso, te aconsejo que lo metas en un Hilo (que seria lo correcto) o en un timer (salida rapida) en donde tendrias que estar consultando si hay datos o no... eso lo consigues guardando el valor de la funcion en una variable local, y luego preguntas por el valor de la cadena, si es vacia.. no hay nada,,, si no... pues ya tu beras como se maneja...

Espero te sirva de ayuda cumpa, ami me funca... claro si es que estas trabajando en delphicito... ... cualquier cosa mantengamonos en contacto...

Atte..

Jobev Lee
Responder Con Cita
  #3  
Antiguo 25-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Me he tomado la libertad de editar un tanto la unidad que ha publicado Jobev Lee para que esta compile (faltaban simplemente un par de comillas simples en alguna que otra cadena de caracteres) y para mostrarla dentro de las etiquetas DELPHI, tan oportunas en este caso como útiles para quien quiera echar un vistazo al código de la unidad que a continuación copio:

Código Delphi [-]
 unit URS232;
 
 interface
 
 uses
     Windows, SysUtils;
 
 type
     TRS232 = class
     private
     sPuerto: string;
     hCommFile: THandle;
     public
     function LeerBuffer: string;
     procedure EscribirBuffer(lsMensaje: string);
     constructor Create(lsPuerto: string; liBanda: Cardinal;
       liByteSize, liParidad, liBitParada: Byte);
     end;
 
 implementation
 
 { TRS232 }
 
 constructor TRS232.Create(lsPuerto: String; liBanda: Cardinal;
   liByteSize, liParidad, liBitParada:Byte);
 var
   CommTimeouts : TCommTimeouts;
     CommConfig: TCommConfig;
     sizeConfig :  Cardinal;
 begin
   sPuerto := lsPuerto;
   hCommFile := CreateFile(PChar(sPuerto),
     GENERIC_READ or GENERIC_WRITE, 0, nil,
       OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 
   with CommTimeouts do
   begin
     ReadIntervalTimeout := 0;
     ReadTotalTimeoutMultiplier := 0;
     ReadTotalTimeoutConstant := 300;
     WriteTotalTimeoutMultiplier := 0;
     WriteTotalTimeoutConstant := 200;
   end;
 
   if not SetCommTimeouts(hCommFile, CommTimeouts) then
       raise Exception.Create('Problemas estableciendo CommTimeouts');
 
     GetCommConfig(hCommFile, CommConfig, sizeConfig);
     with CommConfig do
     begin
         dcb.BaudRate := liBanda;    //9600;//38400;// <-- Se comunica a esa velocidad ????
         dcb.ByteSize := liByteSize; //8;
         dcb.Parity   := liParidad;  //NOPARITY; //EVENPARITY;
         dcb.StopBits := liBitParada;;
     end;
     if not SetCommConfig(hCommFile, CommConfig, sizeConfig) then
     raise Exception.Create('Problemas al querer establecer la configuracion');
 end;
 
 procedure TRS232.EscribirBuffer(lsMensaje: string);
 var
   NumberWritten:dword;
 begin
   if hCommFile = INVALID_HANDLE_VALUE then
     raise Exception.Create('No se puede enviar los datos');
   WriteFile(hCommFile, PChar(lsMensaje)^,
     Length(lsMensaje), NumberWritten, nil);
 end;
 
 function TRS232.LeerBuffer: string;
 var
   sTmp: string;
     c1: integer;
     chBuffer: array[0..255] of char;
     NumberOfBytesRead: dword;
 begin
   if hCommFile=INVALID_HANDLE_VALUE then
     Exit;
   if not ReadFile(hCommFile, chBuffer,
     sizeof(chBuffer), NumberOfBytesRead, nil) then
         raise Exception.Create('Imposible leer datos desde el puerto');
   for c1:= 0 to NumberOfBytesRead - 1 do
     sTmp:= sTmp+chBuffer[c1];
   result:=sTmp;
 end;
 
 end.

Actualización: Si a alguien le place, puede descargarse la unidad que puede verse más arriba en el archivo que se adjunta a este mensaje.
Archivos Adjuntos
Tipo de Archivo: zip URS232.zip (1,1 KB, 354 visitas)
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 25-08-2005 a las 15:23:27. Razón: (actualización)
Responder Con Cita
  #4  
Antiguo 25-08-2005
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 22
IVAND Va por buen camino
Atentos como siempre

Gracias a todos x colaborar estoy probando la unidad que enviaron y la probare .. les comento que el dato es tomado directamente de la bascula en modo ininterrumpido es decir siempre la balanza esta enviado el dato por lo que se muestra en el display de esta se debe reflejar en la pantalla de mi pc

Nuevamente gracias

Espero que mas colaboren con nuevas ideas para avanzar todos


De antemano, Gracias
__________________
IVAND
Responder Con Cita
  #5  
Antiguo 28-08-2005
Avatar de Jobev Lee
Jobev Lee Jobev Lee is offline
Registrado
 
Registrado: jul 2005
Posts: 8
Poder: 0
Jobev Lee Va por buen camino
Talking

Ups.. gracias. cumpa por la correcciòn... jejeje... pero vale.....
Responder Con Cita
  #6  
Antiguo 28-08-2005
IVAND IVAND is offline
Miembro
 
Registrado: may 2003
Ubicación: ECUADOR
Posts: 523
Poder: 22
IVAND Va por buen camino
Gracias a la invalorable ayuda de mi amigo Fidel por fin he utilizado correctamente los componentes Comport ... con el permiso otorgado por Fidel cualquier compañero que necesite el codigo puede pedirmelo con gusto se los enviare


Atentamente,

Iván Dávila
__________________
IVAND
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 12:29:25.


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