Ir al contenido


Foto

Ayuda con recepción de llamadas en los APRO 4.07


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

#1 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 20 marzo 2010 - 09:43

Uso los componetes APRO 4.07, estoy haciendo una aplicación para recibir las llamadas de un conmutador, dicho conmutador tiene un cable serial que va conectado al cpu donde esta mi aplicación, les cuento en detalle que componentes uso para cachar las llamadas, tengo un TadTerminal para visualizar por pantalla los datos de la llamada recibida, en la propiedad ComPort del mismo TadTerminal tengo enlazado al componente TApdComPort, tambien en la propiedad Emulator tengo enlazado al componente AdVT100Emulator, tengo bien configurado las propiedades del TApdComPort,  tambien tengo un TApdDataPacket donde lo enlazo al TApdComPort, al correr el programa se conecta al puerto COM1 y se pone en el estado de "escucha", al hacer una llamada la cacha y lo despliegar perfectamente bien en pantalla ( TadTerminal ), hasta aqui vamos bien, el problema radica cuando intento cachar la llamada para guardarla en una tabla de mi base de datos firebird, aqui lo hago en el evento OnTriggerAvail, el problema que tengo es que el conmutador no manda de un solo jalon los datos de la llamada, se recibe caracter por caracter, no encuentro la forma de ver cual es el caracter de comienzo y el caracter final, ya le puse una pausa dentro del evento Sleep(2); para que se detenga y tomar toda la cadena de un solo jalon:



delphi
  1.   //Recorremos contenido de llamada
  2.   for i := 1 to Count do
  3.   begin
  4.     c:= ApdComPort1.GetChar;
  5.     cadena := cadena + c;
  6.   end;
  7.  
  8.   //Pausamos para tomar toda la línea
  9.   Sleep(2000);


A veces si me funciona, con la 1er llamada, pero al hacer la segunda no lo hace bien, es decir toma la llamada corta, es decir, el conmutador manda esta sintaxis, Extensión , num. telefono, duracion, fecha, hora
cuando digo que se recibe a veces mal es que nomas logro cachar de la extensión hasta la duracion, lo demas cae después del lapso de tiempo, el problema por lo regular se presenta apartir de la 2da llamada en adelante, la 1era siempre la cacho completa, las demas caen incompletas, siendo que en el TapdTerminal se mira bien todas las llamadas, alguien sabe como cachar la llamda en el TapdTerminal ????

Gracias....
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 20 marzo 2010 - 09:52

Tienes que verificar el caracter de control que tiene el paquete de datos para determinar que ahi termina la cadena.

Salud OS
  • 0

#3 agag4

agag4

    Advanced Member

  • Miembros
  • PipPipPip
  • 298 mensajes
  • LocationMéxico

Escrito 20 marzo 2010 - 02:59

En el TapdDataPacket tiene en la propiedad EndString el valor ^M^J ,
Quedaria asi ?? :



delphi
  1. //Recorremos contenido de llamada 
  2. for i := 1 to Count do  begin   
  3.  
  4.   c:= ApdComPort1.GetChar;   
  5.   cadena := cadena + c; 
  6.  
  7.   if Char(c) = '^M^J' then
  8.     CortarLlamada;
  9.  
  10. end;




  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 20 marzo 2010 - 10:29

Esos caracteres ^M^J son el CR y LF o en caracter #13 y #10

Si buscas por #10 encuentras el fin de la cadena.

Salud OS
  • 0

#5 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 21 marzo 2010 - 08:17

Lo primero es que si estas usando ApdComPort1TriggerAvail no necesitas  TApdDataPacket  porque estas usando un evento del apdcomport.  Chequea este ejemplo que pone egostar y mira el hilo. Ya lo demas es mas simple porque lo que le pasas al edit es lo que debes pasarle a la base de datos. Si logras recibirlo en el edit o si quieres usa un listbox  y mira lo que vas recibiendo.  Ya despues de eso podemos dividir la cadena que recibes y guardarla en el campo correspondiente.




delphi
  1. var
  2.   CRTrig: Word;
  3.   Linea: String;
  4.  
  5. procedure TForm1.ApdComPort1TriggerAvail(CP: TObject; Count: Word);
  6. var
  7.   I : Word;
  8. begin
  9.   for I := 1 to Count do
  10.       Linea := Linea + ApdComPort1.GetChar; //Se leen los caracteres recibidos
  11. end;
  12.  
  13. procedure TForm1.ApdComPort1TriggerData(CP: TObject; TriggerHandle: Word);
  14. begin
  15.   if TriggerHandle = CRTrig then begin //cuando es fin de paquete se realizarán las operaciones
  16.     Edit2.Text := Linea;
  17.   end;
  18. end;
  19.  
  20. procedure TForm1.FormShow(Sender: TObject);
  21. begin
  22.   CRTrig := ApdComPort1.AddDataTrigger(#13, False); //Asignamos el caracter CR como el fin del paquete
  23. end;



  lee este hilo


  • 0




IP.Board spam blocked by CleanTalk.