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 19-07-2007
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
OBTENER estado del modem (leyendo el puerto)

Hola Amiguitos delphineros.

Bueno hoy estoy con un problemita con un modem.
Tengo que hacer una llamada a un telefono, Utilizando el modem del PC
el tema es el siguiente.. eh descartado la Utilizacion de la TAPI (telephone API) ya que esta por defecto envia unos mensajes que el usuario no quere ver.

Entonces lo que hice fue.. Abrir el puerto, y enviar los datos de manera manual. (nada del otro mundo)
pero tengo un problema. no puedo OBTENER EL ESTADO DEL MODEM. si esta llamando mas precisamente.
Bueno aca les dejo el Codigo (esto, solo llama a un numero y deja la informacion en un MEMO)..
Los nombes son por defecto (memo1. edit1,2 button..) para que no halla que hacer demasiados cambios.

Si quieren informacion sobre los Comandos del modem. aca dejo un linck

http://www.usr.com/support/3cxm756/3...-ug/atcoms.htm

Código Delphi [-]
var
  Form1: TForm1;
  N:string;
  ComFile: THandle;
implementation

{$R *.DFM}

function OpenCOMPort: Boolean;
var
  DeviceName: array[0..80] of Char;

begin
   { Abrir el Puerto de Comunicaciones.
      Se crea el archivo como Read write para pode obtener los datos luego
   }
// N es el Numero de puerto (proviene de un TextBox)
  StrPCopy(DeviceName, 'COM'+n+':');

  ComFile := CreateFile(@DeviceName,
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0);

  if ComFile = INVALID_HANDLE_VALUE then
    Result := False
  else
    Result := True;
end;


function SetupCOMPort: Boolean;
const
  RxBufferSize = 256;
  TxBufferSize = 256;
var
  DCB: TDCB;
  Config: string;
  CommTimeouts: TCommTimeouts;
begin
   {Configuro los valores del puerto   }

  Result := True;

  if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
    Result := False;

  if not GetCommState(ComFile, DCB) then
    Result := False;

 //Baudios,Paridad,Bits,BitStop)

  Config := '115200,n,8,1';

  if not BuildCommDCB(@Config[1], DCB) then
    Result := False;

  if not SetCommState(ComFile, DCB) then
    Result := False;

  with CommTimeouts do
  begin
    ReadIntervalTimeout         := 0;
    ReadTotalTimeoutMultiplier  := 0;
    ReadTotalTimeoutConstant    := 5000;
    WriteTotalTimeoutMultiplier := 0;
    WriteTotalTimeoutConstant   := 5000;
  end;

  if not SetCommTimeouts(ComFile, CommTimeouts) then
    Result := False;
end;


   {Para Enviar los comandos Solo hay que Escribir el archivo Usando Writefile}

procedure SendText(s: string);
var
  BytesWritten: DWORD;
  r:boolean;
begin
(*se envia Salto de lina, Tambien se puede Usar Salto de lina y retorno de carro
pero por el momento asi funciona no le presto atencion al Valor de retorno de la funcion
es solo para pruebas*)

  s := s + #13;
  r:=WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
end;


{
  Leo la informacion que debuelve el Puerto (en este caso un modem)

}


Function ReadText: string;
var
  d: array[1..80] of Char;
  s: string;
  BytesRead, i: DWORD;
begin
  Result := '';
  if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
  begin
    { Raise an exception }
  end;
  s := '';
  for i := 1 to BytesRead do
   s := s + d[i];
  Application.ProcessMessages;
  Result := s;
end;


procedure CloseCOMPort;
begin
(*Cierra el puerto de Comunicacion*)
  CloseHandle(ComFile);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
//Assigno el Numero del puerto eledigo (se utiliza en OPENCOMPORT)
n:=trim(edit1.text);
//Inicializo puertos y demas. Puede ir todo en la misma Funcion **Cambiar**
If  OpenCOMPort then
   Memo1.Lines.add('Open: TRUE')
else
   Memo1.Lines.add('Open: false');
if SetupCOMPort then
   Memo1.Lines.Add('setup: TRUE')
else
   Memo1.Lines.Add('setup: FALSE');
//Inicializar el modem
Application.ProcessMessages;
SendText('ATZ');
Application.ProcessMessages;
Memo1.Lines.add('send ATZ');
memo1.lines.Add('Receivded: '+ReadText);
//Deberia Devolver ATZ #13#10 OK!!!!
Application.ProcessMessages;
//esto se manda no se para que.. pero bueno ahi va !!INVESTIGAR!!
sendtext('+++');
Application.ProcessMessages;
Memo1.Lines.add('send +++');
Application.ProcessMessages;
memo1.lines.Add('Receivded: '+ReadText);
//devuelve +++
Application.ProcessMessages;

(*
Tono de marcado X3 (desactivado)
L0(cero) Altavoz en OF.. no le da BOLA, (Puede ser por modem externo. Conseguir otro y probar)
M1 nose  que es.. pero asi esta en la cadena de inicializacion..

El esperar tono de marcado puede ser desactivado enviando solo
ATX3

 *)
Memo1.Lines.add('send ATL0M1X3');
SendText('ATL0M1X3');
Application.ProcessMessages;
Application.ProcessMessages;
memo1.lines.Add('Receivded: '+ReadText);
//debe devolver  ATL0M1X3 #13#10 OK

//Edit2.text (Numero a marcar)
//ATDT+numero llama al numero...
SendText('ATDT'+Edit2.text);
Application.ProcessMessages;
Memo1.Lines.add('send ATDT '+Edit2.text);
Application.ProcessMessages;
memo1.lines.Add('Receivded: '+ReadText);
//devuelve ATDT+(Numero marcado)
Application.ProcessMessages ;
memo1.lines.Add('Receivded: '+ReadText);
Application.ProcessMessages ;
//SendText('ATX0');
Application.ProcessMessages;
memo1.lines.Add('Receivded: '+ReadText);
Application.ProcessMessages;
//x1SendText('ATDTX1');
Application.ProcessMessages;
memo1.lines.Add('Receivded: '+ReadText);





end;
(*colgar Telefono*)
procedure TForm1.Button2Click(Sender: TObject);
begin
//Cuelgo telefono
SendText('ATH');
//Libero el archivo
CloseCOMPort;
end;

end.

Saludos!!
Responder Con Cita
  #2  
Antiguo 19-07-2007
loxod loxod is offline
Miembro
 
Registrado: feb 2007
Ubicación: Mexico
Posts: 45
Poder: 0
loxod Va por buen camino
Espero que te sirva
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject); 
var 
  CommPort : string; 
  hCommFile : THandle; 
  ModemStat : DWord; 
begin 
  CommPort := 'COM2'; 

  hCommFile := CreateFile(PChar(CommPort), 
                          GENERIC_READ, 
                          0, 
                          nil, 
                          OPEN_EXISTING, 
                          FILE_ATTRIBUTE_NORMAL, 
                          0); 
  if hCommFile = INVALID_HANDLE_VALUE then 
  begin 
    ShowMessage('No se puede abrir '+ CommPort); 
    exit; 
  end; 

  if GetCommModemStatus(hCommFile, ModemStat) <> false then begin 
    if ModemStat and MS_CTS_ON <> 0 then 
      ShowMessage('El CTS (clear-to-send) esta listo.'); 
    if ModemStat and MS_DSR_ON <> 0 then 
      ShowMessage('El DSR (data-set-ready) esta listo.'); 
    if ModemStat and MS_RING_ON <> 0then 
      ShowMessage('El ring indicator esta listo.'); 
    if ModemStat and MS_RLSD_ON <> 0 then 
      ShowMessage('El RLSD (receive-line-signal-detect) esta listo.'); 
end; 

  CloseHandle(hCommFile); 
end;
Responder Con Cita
  #3  
Antiguo 20-07-2007
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
Buenisimo!! lo voy a Probar pero seguramente Funciona.. ya me puse a ver sobre esta funcion..
No tenia ni idea de que existia jojo

GRAACIAS!
Responder Con Cita
  #4  
Antiguo 20-07-2007
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
Loxod!! Bueno probe la funcion.. y no.. desgraciadamente no he podido Ver SI el modem Esta llamando,. con esto puedo ver Si ME llaman.. o si los estados estan disponibles, (si estoy hablando, ETc). pero no lo que busco.

Gracias de todas maneras!
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Qué libro estoy leyendo? marcoszorrilla La Taberna 27 19-07-2011 00:39:14
leyendo tabla en excel solarin Conexión con bases de datos 3 25-01-2011 23:41:05
Mucho retardo de Locate leyendo DB2 de un AS400 Javier_A Conexión con bases de datos 6 05-04-2005 13:37:35
Como manejar el modem de la PC para establecer un comunicacion con modem de 1200 baud Roger_Fernandez Varios 0 01-11-2004 12:33:38


La franja horaria es GMT +2. Ahora son las 21:30:40.


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