PDA

Ver la Versión Completa : Ayudemos a utilizar Comport (Rs232)


IVAND
25-08-2005, 03:15:50
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
procedure TMainForm.ComTerminalStrRecieved(Sender: TObject;
var Str: String);
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 ;

Jobev Lee
25-08-2005, 13:12:16
Bueno, te cuento una buena.. :cool: 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) :rolleyes: ... 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...

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, :D ami me funca... claro si es que estas trabajando en delphicito... :cool: ... cualquier cosa mantengamonos en contacto...

Atte..

Jobev Lee

dec
25-08-2005, 15:20:36
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:


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.

IVAND
25-08-2005, 22:27:02
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

Jobev Lee
28-08-2005, 11:33:34
:D Ups.. gracias. cumpa por la correcciòn... jejeje... pero vale.....

IVAND
28-08-2005, 23:49:07
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

davidelkata
24-08-2006, 13:05:49
Tengo una balanza XWILD-15P y no consigo de ninguna manera capturar información de ella alguien conoce esta balanza y puede decirme algo se agradeceria la respuesta es bastante urgente.
Un saludo.

jachguate
24-08-2006, 17:14:00
Tengo una balanza XWILD-15P y no consigo de ninguna manera capturar información de ella alguien conoce esta balanza y puede decirme algo se agradeceria la respuesta es bastante urgente.
Un saludo.

¿No venía acompañada de un manual técnico? ¿has preguntado a tu proveedor si dispone de alguno? ¿al fabricante? ¿a san google (http://www.google.com)?

:confused:

davidelkata
25-08-2006, 09:54:44
Tengo delante el manual de la balanza y no me pone nada para conectarla con un pc. He llamado al proveedor y me han mandado 3 folios que no los entiendo los he puesto adjuntados al mensaje, yo ya he usado el puerto serie para lectores de codigos de barras y nunca he tenido ningun problema, la cosa es que no consigo recibir ningun dato de la bascula nada, la foto de la bascula esta en esta url. Y como te dije anteriormente es bastante urgente,


http://www.balanzadirect.com/listadoproductos.php?idcp=120&idp=122

Estas son las caracteristicas de las basculas

XWILD-15P

Balanza comercial de precio/peso/importe
Aprobación CE de modelo con Verificación de serie 'M'
Plato de pesada de acero inoxidable
Dimensiones balanza, 360x385x435mm
Visor frontal (vendedor) y posterior (comprador)
4 modos de iluminación del display
5 PLU directos alfanumericos
Batería interna recargable
Salida de datos RS-232 para impresora o PC (opcional)
Con 3 lineas de cabecera de ticket
Descuento en el total de venta
Total de ventas diarias

Como se puede ver pone conexión a pc.
Si por favor alguien puede ayudarme se lo agradeceria

FGarcia
25-08-2006, 17:31:20
Hola!

De entrada no aparecen los adjuntos, en el enlace de la imagen dice que la opcion de salida serial es OPCIONAL ¿ya verificaste que la tenga instalada tu bascula?

JULIPO
31-08-2006, 05:47:06
saludos cordiales me parece importante que publiques el trabajo con las librerias y de partida indiques el web site donde se consiguen.

saludos

RGW
08-02-2008, 18:15:05
Hola:
He utilizado la libreria URS232, la cual me permitio usar el constructor Create para crear el puerto pero no logro escribir y leer del mismo alguien podria mandarme un ejemplo sencillo de como leer y escribir.

Muchas Gracias

alcafe
03-02-2011, 11:41:55
Buenas, yo también me estoy pegando con una báscual SC1 de la empresa Sensocar, y en mi caso para que me dé el PESO he de enviarle la cadena 'SN' + Retorno (13), pero no consigo hacerlo. Sin ninguna cadena, sí que me devuelve, pero no sé cómo enviarle 'SN' y que me devuelva el Peso. Utilizo un programa 'Realterm' para comprobar que, en efecto, hay comunicación y enviándole 'SN' de devuelve el peso. En fin, a ver si alguien avanzado en la materia me sabe dar una respuestas.
Muchas gracias.

ambiorixml
30-03-2020, 19:21:54
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


******************Podrias facilitarme el codigo fuente para utilizar correctamente el componente comport en delphi 6 para una bascula Datalogic Magellan 8300 / 8400?

ambiorixml
16-04-2020, 00:23:51
Buenas,

Equipo, este es el codigo que estoy utilizando pero no me funciona con la bascula DATALOGIC MAGELLAM 8300, alguien me puede colaborar.

procedure TFormTpv.TimerPesoTimer(Sender: TObject);
Var
Peso : String;
PesoNumero,eCantidad : Double;
Pesar : TComport;
liBanda:Cardinal;
begin
Try
// ***Le asigno los parametros seleccionados para la prueba de conecion y lectura de la balanza.
Memo1.Lines.Add('INICIO'); //Para controlar los eventos ocurridos.
Pesar.Connected:=False;
Pesar.Port:=ComPort1.Port;
Pesar.BaudRate:=ComPort1.BaudRate;
Pesar.DataBits:=ComPort1.DataBits;
Pesar.StopBits:=ComPort1.StopBits;
Pesar.Parity:= ComPort1.Parity;
Pesar.Connected:=True;
Memo1.Lines.Add('CONECTADO'); //Para controlar los eventos ocurridos.
Sleep(250);
Pesar.ReadStr(Peso,15);
Edit1.Text:=Peso;
Pesar.Close;
Edit2.Text:=Copy(Edit1.Text,3,8);
//Edit2.Text:=CambiaEn(Edit2.Text,'.',',');
eCantidad:=StrToFloat(Edit2.Text);
Memo1.Lines.Add('LECTURA'); //Para controlar los eventos ocurridos.
TimerPeso.Enabled:=False;// No lo detengo de momento para ver lo que hace.
Memo1.Lines.Add('FIN');
Except
on E: exception do
begin
Memo1.Lines.Add('ERROR...'); //Para controlar los eventos ocurridos.
Memo1.Lines.Add(e.message);
eCantidad:=0;
//TimerPeso.Enabled:=False; // No lo detengo de momento para ver lo que hace.
end;
End;
end;

procedure TFormTpv.Button1Click(Sender: TObject);
begin
// Habilitado para poder hacer cambios en las paremetrizaciones del componente TCOMPORT.
TimerPeso.Enabled:= false;
ComPort1.ShowSetupDialog;
TimerPeso.Enabled:= true;
end;
end.

IVAND
16-04-2020, 01:15:41
Te puedo pasar un programita que es de un companero del foro para que pruebes con los parametros , creo que eso puede ser
asumiendo que ya has probado que la bascula envie los datos bien puedes probar con hyperteminal

si es asi me indicas un correo para pasartelo

ambiorixml
16-04-2020, 19:41:38
Hola ivan,

Aqui esta mi correo:

ambiorixml @ gmail . com

Muchas gracias de ante mano

Casimiro Notevi
16-04-2020, 20:10:40
No hace falta publicar emails, basta con pulsar en el nick y aparece un menú con distintas opciones, una de ellas es enviar por email.


https://i.imgur.com/sIBgjI1.png

ambiorixml
16-04-2020, 21:25:17
Distinguido Casimiro, muchas gracias por la aclaracion, ya le había remitido un correo a ivan por esta via.

Por otra parte para que me puedan colaborar mejor, aqui les dejo lo que he logrado investigar de la básculas Datalogic Magellam 8200, 8300 y 8400 respectivamente.

Tambien pongo de su conocimiento que he probada casi todas las propuestas sugeridas en los distintos foros de este portal sin obtener resultados positivos.

Por ultimo tambien, les dejo código fuente utilizado de la ultima prueba de lectura de esta bascula o Balanza Datalogic Magellam, recordandoles que la misma no solamente lee pesos , sino que también codigos de Barras.

Los hallazgos que tengo hacen referencia a que lo primero que hay que hacer es instalar el programa que viene con ella, llamado Datalogic OPOS Package. El cual instala los controladores (dll y ocx's necesarios), dentro del mismo, viene un programa llamado Dual Test, con él podemos hacer las pruebas utilizando el software de Datalogic, pero como es sólo para pruebas, no nos servirá para otra cosa, más que probar tanto la balanza (báscula) como el lector de códigos de barra.

Luego indican utilizar librería de la instalación OPOS.Scale.1.13.

Balanza = CreateObject("OPOS.Scale.1.13") esto lo vi en FOXPRO.

Tratando de instalarla pori active x, la misma no es compatible con delphi 6 así que posición anterior.

Hermano IVAND, espero por su colaboración, favor no me abandonen, ya que tengo una aplicacion desde hace varios años en un supermeracado, compraron estas basculas y el chiste de que a través de una pistola para leer codigo de barra y un dispositivo que traduce el peso de la bascula, ya no es funcional para el negocio, resuelven pero necesito dar el paso. Por favor me podrian todos colaborar....?


Codigo Fuente:

procedure TFormTpv.TimerPesoTimer(Sender: TObject);
Var
Peso : String;
PesoNumero,eCantidad : Double;
Pesar : TComport;
liBanda:Cardinal;
begin
Try
// ***Le asigno los parametros seleccionados para la prueba de conecion y lectura de la balanza.
Memo1.Lines.Add('INICIO'); //Para controlar los eventos ocurridos.
Pesar.Connected:=False;
Pesar.Port:=ComPort1.Port;
Pesar.BaudRate:=ComPort1.BaudRate;
Pesar.DataBits:=ComPort1.DataBits;
Pesar.StopBits:=ComPort1.StopBits;
Pesar.Parity:= ComPort1.Parity;
Pesar.Connected:=True;
Memo1.Lines.Add('CONECTADO'); //Para controlar los eventos ocurridos.
Sleep(250);
Pesar.ReadStr(Peso,15);
Edit1.Text:=Peso;
Pesar.Close;
Edit2.Text:=Copy(Edit1.Text,3,8);
//Edit2.Text:=CambiaEn(Edit2.Text,'.',',');
eCantidad:=StrToFloat(Edit2.Text);
Memo1.Lines.Add('LECTURA'); //Para controlar los eventos ocurridos.
TimerPeso.Enabled:=False;// No lo detengo de momento para ver lo que hace.
Memo1.Lines.Add('FIN');
Except
on E: exception do
begin
Memo1.Lines.Add('ERROR...'); //Para controlar los eventos ocurridos.
Memo1.Lines.Add(e.message);
eCantidad:=0;
//TimerPeso.Enabled:=False; // No lo detengo de momento para ver lo que hace.
end;
End;
end;

procedure TFormTpv.Button1Click(Sender: TObject);
begin
// Habilitado para poder hacer cambios en las paremetrizaciones del componente TCOMPORT.
TimerPeso.Enabled:= false;
ComPort1.ShowSetupDialog;
TimerPeso.Enabled:= true;
end;
end.