Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   necesito experto en comport !! (https://www.clubdelphi.com/foros/showthread.php?t=37180)

elbert 05-11-2006 14:30:31

necesito experto en comport !!
 
Estoy tratando de comunicarme a travez de COM1 con una pesa-scaner PSC magellan con readstring y writestrng y no lo he logrado. Alguien sabe como hacerlo ?

Al González 05-11-2006 19:51:37

¡Hola a todos!

Elbert:

Para comunicación por puertos COM y cuestiones similares, te recomiendo los componentes TurboPower Async Professional.

Dinos, ¿qué es una «pesa-scaner PSC magellan»?

Un abrazo escaneado.

Al González. :)

elbert 06-11-2006 02:12:41

comunicacion serial
 
Saludos , gracias por contestar . La pesa magellan es un lector de codigos de barra con pesa ( para medir peso ) usada en los supermercados . Tengo un programa de punto de venta ( caja registradora ) y necesito leer el puerto serial para saber el codigo de barra y el peso de el producto . Trate con readstring pero no lograba enteder lo que leia , estoy tratando con un componente Asinc pro , puedo leer pero no se como detectar cuando hay algo en el buffer , ni cuantos caracteres tengo que leer .
Voy a tratar el componente que me recomiendas.
Gracias

jairo guzman 18-02-2007 00:41:36

Bueno, en primer lugar seria interesante saber el Baud Rate empleado y que cantidad de informacion estas enviando por segundo.

Pero por lo pronto el comport es una buena solucion a tu problema el siguiente codio te puede ayudar a detectar la cantidad de datos recibidos y cuantos datos debes leer.

Hay dos formas de leer el buffer de estrada, en realidad son dos eventos el que yo he utilizado es el evento OnRxChar, en est evento insertas el siguiente codigo

void __fastcall TForm1::ComPortRxChar(TObject *Sender)
{
int x;
unsigned char buf;

x=ComPort->InputCount();
//en x esta el numero de bytes recibidos
while(ComPort->InputCount())
{
buf=ComPort->ReadByte();
ComPort->WaitForReadCompletion();
//en buf esta cada uno de los bytes recibidos
}
}

Esta forma de leer tiene 2 inconvenientes y es que si envias muchos datos a un baud rate bajo puedes perder parte de la informacion para esto en el momento en que abres el puerto incrementas el valor del bufer de entrada con ComPort->BufferSize->Inpout=10000, por ejemplo.

el otro problema es que la lectura del puerto podria tornarse lenta en cuanto a que estas analizando la informacion byte a byte, en este punto puedes utilizar los otros componentes de lectura tales como el ReadString o el Read o cualquier otro, pero estos tienen un fin de cadena especifico y debes tener cuidado con eso, el la ayuda del comport especifican algunos de estos fines de cadena pero esta algo incompleto.

En este momento estoy probando con el componente Read que te permite leer una cantidad de datos determinada del buffer de entrada pero aun no se como funciona bien y lo estoy probando haci que te reboto la pregunta,
si encuentras alguna informacion al respecto de la directiva read del comport me la podrias facilitar?

Espero que esto te ayude.

jairo guzman 18-02-2007 00:42:52

necesito experto en comport!!
 
Bueno, en primer lugar seria interesante saber el Baud Rate empleado y que cantidad de informacion estas enviando por segundo.

Pero por lo pronto el comport es una buena solucion a tu problema el siguiente codio te puede ayudar a detectar la cantidad de datos recibidos y cuantos datos debes leer.

Hay dos formas de leer el buffer de estrada, en realidad son dos eventos el que yo he utilizado es el evento OnRxChar, en est evento insertas el siguiente codigo

void __fastcall TForm1::ComPortRxChar(TObject *Sender)
{
int x;
unsigned char buf;

x=ComPort->InputCount();
//en x esta el numero de bytes recibidos
while(ComPort->InputCount())
{
buf=ComPort->ReadByte();
ComPort->WaitForReadCompletion();
//en buf esta cada uno de los bytes recibidos
}
}

Esta forma de leer tiene 2 inconvenientes y es que si envias muchos datos a un baud rate bajo puedes perder parte de la informacion para esto en el momento en que abres el puerto incrementas el valor del bufer de entrada con ComPort->BufferSize->Inpout=10000, por ejemplo.

el otro problema es que la lectura del puerto podria tornarse lenta en cuanto a que estas analizando la informacion byte a byte, en este punto puedes utilizar los otros componentes de lectura tales como el ReadString o el Read o cualquier otro, pero estos tienen un fin de cadena especifico y debes tener cuidado con eso, el la ayuda del comport especifican algunos de estos fines de cadena pero esta algo incompleto.

En este momento estoy probando con el componente Read que te permite leer una cantidad de datos determinada del buffer de entrada pero aun no se como funciona bien y lo estoy probando haci que te reboto la pregunta,
si encuentras alguna informacion al respecto de la directiva read del comport me la podrias facilitar?

Espero que esto te ayude.

rruz 19-02-2007 16:16:49

Primero que todo el utilizar los componentes TurboPower Async Professional Para comunicacion serial RS232 es un punto en el cual no hay discusion ya que son el estandard en este area.

Una vez dicho esto y asumiendo que ya instalaste los componentes vamos a utilizar el componente TApdComPort.


Para recibir informacion desde el dispositivo
En TApdComPort debes utilizar el evento OnTriggerAvail .

Ej :


Código Delphi [-]
procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
i : integer;
c : Char ;
begin

for i := 1 to Count do
begin
c:= ApdComPort1.GetChar;

//Aqui puedes consultar por el caracter retornado
//segun la documentacion del dispositivo

Case c of
'A' :Proc1;
'$' :Proc2:
'%':Proc3;
End;


//o puedes acumular en un buffer (String) los caracteres

Cadena:=Cadena+c;

end;

end;






No olvides declarar lo siguiente al inicializar la rutina


Código Delphi [-]
ApdComport1.AddDataTrigger('Prueba',True)






Para enviar Datos utiliza


Código Delphi [-]
ApdComport1.PutChar('A');

// o bien

ApdComport1.PutString('Esta es una prueba');





Saludos.

egostar 19-02-2007 18:54:02

Siguiendo con el asunto del Apro, la forma mas fácil de recibir paquetes es usando el componente ApdDataPacket, solo requieres conocer el inicio de la cadena y el final de la cadena o al menos uno de ellos.

En protocolos normales se inicia con STX (02h) y termina con ETX (03h), algunos protocolos no tienen un caracter fijo de inicio pero si tienen LF+CR (10h,13h).

Con este componente te olvidas de buscar dentro de los caracteres recibidos el paquete que deseas.

Aqui un ejemplo:

Código Delphi [-]
procedure TLector.ApdDataPacket1StringPacket(Sender: TObject;
  Data: String);
begin
  Linea := Data;
  If (Linea[5] = 'A') then begin
     ProcesaInformacion('A');
  end;
end;

Saludos.

Edito: Por cierto, este componente APro me lo recomendó Al Gonzalez hace mucho tiempo, gracias Al me ha servido increiblemente.

pollo_c 24-02-2007 07:01:36

ayuda egostar o rruz
 
disciulpen que me meta en el hilo, pero tengo un problema en el archivo tpapro docs tpapro407a3 viene una descripción de cómo se instalan los paquetes o componentes del archivo tpapro407a3 pero no funciona, quisiera que me orientaran paso a paso en la instalación de estos paquetes si no es mucha molestia. gracias

jairo guzman 25-02-2007 09:34:52

de acuerdo...
 
bueno, en primer lugar les doy las gracias por ayudarme a resolver este inconveniente, yo programo basicamente en builder 6, sin embargo comprendi el mensaje que me enviaron y ya he logrado solucionar el problema que tenia.

chuyleon 26-02-2007 20:51:26

Freeware para puertos seriales
 
Hola a todos, yo he hecho algo parecido con basculas y todo lo he resuelto con un componente freeware para delphi: TSerialNG. Espero que con esto resuelvas tus problemas. Byee.:)


La franja horaria es GMT +2. Ahora son las 04:52:58.

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