Ir al contenido


Foto

Problemas al configurar bascula de pesaje


  • Por favor identifícate para responder
27 respuestas en este tema

#21 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 22 abril 2010 - 09:20

Ahora el problema que tengo es la forma de cachar los caracteres que me manda la bascula, buscando, encontre esta forma :


delphi
  1. procedure TMainForm.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
  2. var
  3.   I : Word;
  4.   C : String;
  5. begin
  6.   Memo1.Lines.Add('RECIBIDO :');
  7.   for I := 1 to Count do
  8.   begin
  9.       C := C + ApdComPort1.GetChar; // Aqui puede tomar estos valores para sus nesecidades
  10.       Memo1.Lines.Add(C); // Habilitar esto para mostrar byte por byte
  11.     end;
  12.     Memo1.Lines.Add(C); // Habilitar esto para mostrar como cadena
  13.     edPeso.Text := C ;
  14.     Memo1.Lines.Add('')
  15. end;


El resultado lo muestro en un TEdit, y lo que me muestra es lo siguiente:


delphi
  1. kg||00||



El resultado tambien lo muestro en un TMemo, y lo que me muestra es lo siguiente:


delphi
  1. kg
  2. kg
  3.  
  4. kg
  5. 0
  6. kg
  7. 00
  8. kg
  9. 00
  10. kg
  11. 00||





  • 0

#22 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 22 abril 2010 - 09:32

Prueba superada, lo que hice fue tomar el demo de los apro el TermDemo.dpr, le puse un boton para mandar pedir el peso de la siguiente manera:


delphi
  1. ApdComPort1.PutString('W'+#13);





Y ya me regreso el peso, cosa que no me explico porque no me regreso el peso en el hyperteminal, ahora tengo otra duda, para que continuamente me ponga el peso en pantalla necesitaria poner un timer ??, he visto en muchas cajas de tiendas de autoservicio que en cuanto pone el peso se lo manda y mueves el articulo y se mueve el peso en la pantalla algo "Automatico" por asi decirlo, es cuestion de hacer pruebas, gracias compañeros....


Segun se, el teclado de la PC no envia un CR (ASCII 13) - Carriage Return o Retorno de Carro- sino un LF (ASCII 10) -Line Feed o Alimenta Linea o Nueva Linea - asi que la bascula al recibir algo no esperado te envia un caracter que te dice que "no entiende", eso es lo que visualizaste en el Hyperteminal. No tengo el manual de la bascula pero revisa si tiene opcion de Transmision Continua, asi la bascula estara enviando constantemente el dato de peso y tu aplicacion abrira el puerto cuando necesite leer o lo visualizara constantemente.
  • 0

#23 FGarcia

FGarcia

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 687 mensajes
  • LocationMéxico

Escrito 22 abril 2010 - 09:35

Mi mensaje anterior llego despues de que publicaste.

Los datos que envia la bascula ya estan en una cadena fija por ejemplo: xxxxx.xx kg<CR>

Usa el componente de los apro que te permite capturar el paquete completo y le colocas como fin de cadena el caracter de control <CR>

Edito: TApddataPacket es el componentes para paquetes.



delphi
  1. procedure TdmSerial.SeriePackStringPacket(Sender: TObject; Data: AnsiString);
  2. var
  3.   tmpStr:string;
  4. begin
  5.   tmpStr := Copy(Data,2,7);
  6. end;


  • 0

#24 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 22 abril 2010 - 10:02

Ya encontre la forma de tomar los caracteres, gracias a una respuesta de egostar en un hilo

http://www.delphiacc...hp?topic=1364.0

solo que hice una pequeña mexicanada en el evento ApdComPort1TriggerData, como veo que la bascula me pasa en el peso 2 letras al final ( kg ), cada vez que llega al final del ultimo caracter en el evento busco esas 2 letras:


delphi
  1.   if TriggerHandle = CRTrig then begin//cuando es fin de paquete se realizarán las operaciones
  2.  
  3.     if FoundStr(&#39;KG&#39;,UpperCase(C)) then
  4.       edPeso.Text    := FormatFloat(&#39;###,##0.000&#39;,StrToFloat(LimpiaCampoFloat(C)));
  5.      
  6.     C := &#39;&#39;;
  7.   end;
  8.  



  • 0

#25 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 22 abril 2010 - 01:59

var
  CRTrig: Word;
  Linea: String;

procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
var
  I : Word;
begin
  for I := 1 to Count do
      Linea := Linea + ApdComPort1.GetChar; //Se leen los caracteres recibidos
end;

procedure TForm1.ApdComPort1TriggerData(CP: TObject; TriggerHandle: Word);
begin
  if TriggerHandle = CRTrig then begin //cuando es fin de paquete se realizarán las operaciones
    Edit2.Text := Linea;
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  CRTrig := ApdComPort1.AddDataTrigger(#13, False); //Asignamos el caracter CR como el fin del paquete
end;


lo saque de este HILO

La idea es que si quieres utilizar el datatrigger, puedes colocar el final del paquete como se indica en el evento onshow. Por otro lado para el caso tuyo, creo que como es una cadena con informacion fija, talvez el datapacket te funcione mejor y con menos codigo. Te buscare un ejemplo del datapacket de algo que me dijo egostar que es el que realmente sabe de todo esto.

Lee el hilo que te puede dar algunas ideas.

  • 0

#26 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 abril 2010 - 03:08

Hola agag4

Si puedes colocar como es que te llegan las cadenas te puedo ayudar con la solución, es igual que uses un datapacket que los eventos del apdComPort.

Por lo que veo ya tienes una solución, pero me parece que podemos refinarla ;)

Salud OS
  • 0

#27 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 22 abril 2010 - 03:38

Mi consejo es usar un thread y las apis de windows para acceder al puerto, el resultado es perfecto  (y)

PD: Tengo el código justo aquí, pero no puedo publicarlo ... como odio ser un programador a sueldo  : ... bueno lo de cobrar tampoco esta tan mal  :D
  • 0

#28 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 22 abril 2010 - 06:17

me llegan 2 renglones de cadenas, en el renglon 1 me llega con el peso + KG + Enter y en el renglon 2 me llegan 2 ceros, ejemplo:
12.400 kg #13
00
  • 0




IP.Board spam blocked by CleanTalk.