El lunes pasado tuve la necesidad de hacer exáctamente lo que pides.
Lo logré, pero no estoy conforme con la forma.
Te cuento:
Hay 2 maneras de detectar el ring del teléfono:
1- Usando TAPI (Telephone Aplication Program Interface).
2- Usando el control MSCOMM para trabajar con el modem.
En el primer caso no pude avanzar demasiado porque todavía no entiendo bien
como funciona sobre todo el tema de los CallBacks.
En el segundo caso parece bastante fácil, se abre el puerto que está
conectado con el modem y en el evento OnComm se espera que la propiedad
CommEvent del objeto MSCOMM venga con el valor comEvRing, pero en mi caso
(U.S. Robotics 33.600 interno) este evento no se produce nunca.
Busqué la solución de otra manera verificando qué eventos se producen al
recibir una llamada y el único evento que se producía era comEvReceive.
Entonces me fijé en qué caracteres venían por el puerto y me encontré con
que decía RING cada vez que sonaba el teléfono. La solución entonces fue
detectar la entrada de la palabra RING por el puerto de comunicaciones que
tienen conectado el modem.
Específicamente debes poner la propiedad RThreshold = 1 para que el evento
OnComm se ejecute cada vez que recibes 1 caracter e ir procesándolo. El
puerto debe estar abierto durante todo el tiempo de ejecución del programa.
Las desventajas de este método son:
1- Probablemente no funcione con cualquier modem
2- Al tener abierto el puerto todo el tiempo no puedes usar otro programa.
Usando TAPI estas ventajas desaparecerían.
Te cuento que necesité hacer un programa con estas características ya que
pusimos una línea 0-800 (que atiendo personalmente) y necesito registrar
todas las llamadas que ingresan. Pero como hago otras cosas, y no estoy
pendiente del teléfono, quería que el programa de registro apareciera
automáticamente al momento de recibir una llamada y que el levantar el tubo
ya estuviera disponible un registro indicando la fecha y hora de la llamada,
listo para registrar los resultados. Lo tengo funcionando desde el martes.
Me gustaría que me contaras cual es tu proyecto.
Peky.
------------------------------------------------
e-mail <peky@satlink.com>
-----Original Message-----
De: Pere Fortea <pfnredes@redestb.es>
Para: vb <vb-esp@ccc.uba.ar>
Fecha: Miércoles 28 de Enero de 1998 17:46
Asunto: (VB-ESP) Modem llamadas entrantes HELP
> Hola amigos de la lista.
>
> Estoy creando una aplicación y me gustaría que cuando mi aplicación
> detectara dos RINGS telefónicos me avisase (tipo cuando el Fax está
activo).
>
> Agradecería cualquier ejemplo o consejo gracias a todos.
>
> Pere
>
>
>
At 21:46 28/01/98 +0100, Pere Fortea wrote:
>Hola amigos de la lista.
HOLA
>Estoy creando una aplicación y me gustaría que cuando mi aplicación
>detectara dos RINGS telefónicos me avisase (tipo cuando el Fax está activo).
>
>Agradecería cualquier ejemplo o consejo gracias a todos.
>
>Pere
>
>
RESPUESTA A TU PROBLEMA
Puedes tener dos tipos de módem. Puede ser, aunque no es lo normal, que te
envíe por un hilo de la conexión RS-232 la señal RING (Patilla 22 del
conector SubD-25. El SubD-9 ni la trae, pues ya te digo YA no es normal).
Como va a la lista analizo esta posibilidad para generalizar la solución.
Pones un MSComm (con Name = MSComm1) y en su procedimiento OnComm analizas
si el CommEvent se ha producido por efecto de la señal Ring
Private Sub MSComm1_OnComm()
Static contador As Integer
If MSComm1.CommEvent = comEvRing Then
contador = contador + 1
End If
If contador = 2 Then
contador = 0 'lo dejas preparado para la próxima llamada
' AKI tu código. El mío pone en la etiqueta Label3 "HAN SONADO 2 TIMBRAZOS"
Label3.Caption = "HAN SONADO 2 TIMBRAZOS"
End If
End Sub
Sin embargo no es normal en un módem moderno que exista esa patilla, por lo
que para avisar que está recibiendo el timbre, envía por la entrada de
datos (RxD, pin 2 si es SubD-9, 3 si es SubD-25) una cadena de caracteres.
Lo normal y programado de fábrica para esa cadena es RING. Pero cuidado, se
puede cambiar con la programación del Módem. Supongamos que no se ha
cambiado y es RING. Esta cadena la envía el módem justo en el momento en
que deja de tocar el timbre.
Haz lo mismo, mete un MSComm de nombre MSComm1 y pon en su procedimiento
OnComm el siguiente código:
---
Dim entrada As String
Dim I As Integer
Dim A As String
'Analizas si el que ha producido el evento OnComm es la recepción de
caracteres
If MSComm1.CommEvent = comEvReceive Then
entrada = MSComm1.Input
'como el MSComm te puede enviarr mas de un caracter de un golpe, destripas
'la cadena que te envía para anlizarla letra a letra
For I = 1 To Len(entrada)
A = Mid(entrada, I, 1)
'aqui eliminas CRs, LFs, espacios y otros posibles caracteres de control
If Asc(A) > 32 Then
salida = salida & A
End If
Next I
'salida es una variable que irá engordando según se vayan recibiendo
caracteres
'para evitarlo, y dado que solamente necesitas dos timbrazos, nos quedamos
'con los 8 caracteres que tiene a la derecha
salida = Right(salida, 8)
If UCase(salida) = "RINGRING" Then
Label3.Caption = "HAN SONADO DOS TIMBRAZOS"
' AKI netes el código que a tí te interese
End If
End If
End Sub
------
Probado. Funciona.
Perdonad que me haya extendido
Saludos desde San Sebastian de los Reyes (Madrid)
Luis Suárez
Te envío esta pequeña aplicación. He tenido que hacersela para un par de
colegas
que no sé que les pasa que no les funcionó. Yo empleo esta forma de
detectar el RING en varias aplicaciones y nunca he tenido problemas con
ningín tipo de módem (Detecto la palabra RING. )
Espero que te sirva
Saludos
Luis Suárez
VERSION 4.00
Begin VB.Form Form1
Caption = "Detector de Rings telefónicos"
ClientHeight = 3105
ClientLeft = 2025
ClientTop = 2040
ClientWidth = 6105
Height = 3510
Left = 1965
LinkTopic = "Form1"
ScaleHeight = 3105
ScaleWidth = 6105
Top = 1695
Width = 6225
Begin VB.CheckBox Check1
Caption = "Detección de linea RING (Patilla 22)"
Height = 255
Left = 120
TabIndex = 6
Top = 2040
Width = 2895
End
Begin VB.TextBox tbPuerto
BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}
Name = "MS Sans Serif"
Size = 12
Charset = 0
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 420
Left = 1560
TabIndex = 5
Text = "2"
Top = 120
Width = 255
End
Begin VB.TextBox Text1
Height = 1815
Left = 3600
MultiLine = -1 'True
TabIndex = 4
Top = 1080
Width = 2415
End
Begin VB.CommandButton cmdbABRIR
Caption = "ABRIR PUERTO"
Height = 495
Left = 120
TabIndex = 3
Top = 960
Width = 1695
End
Begin VB.Label Label6
Caption = "Para que funcione, el puerto debe estar abierto"
Height = 255
Left = 120
TabIndex = 9
Top = 600
Width = 3495
End
Begin VB.Label Label5
Caption = "Ejemplo realizado para vb-esp@ccc.uba.ar por lsuarez@iies.es Enero 1998"
Height = 495
Left = 120
TabIndex = 8
Top = 2400
Width = 3135
End
Begin VB.Label Label1
Caption = "Caracteres recibidos"
Height = 255
Left = 3600
TabIndex = 7
Top = 840
Width = 1575
End
Begin VB.Label Label4
Caption = "Modem en ComX"
Height = 255
Left = 120
TabIndex = 2
Top = 120
Width = 1335
End
Begin VB.Label Label3
Caption = "Label3"
Height = 255
Left = 120
TabIndex = 1
Top = 1680
Width = 2775
End
Begin VB.Label Label2
Caption = "(Poner aqui el puerto adecuado)"
Height = 255
Left = 2040
TabIndex = 0
Top = 120
Width = 2415
End
Begin MSCommLib.MSComm MSComm1
Left = 5520
Top = 120
_ExtentX = 1005
_ExtentY = 1005
_Version = 327680
CommPort = 2
DTREnable = -1 'True
RThreshold = 1
RTSEnable = -1 'True
End
End
Attribute VB_Name = "Form1"
Attribute VB_Creatable = False
Attribute VB_Exposed = False
Option Explicit
Private Sub cmdbABRIR_Click()
'LO PRIMERO ABRIR EL PUERTO
'tomamos el número del puerto deste tbPuerto
MSComm1.CommPort = Val(tbPuerto.Text)
'abrimos el puerto
MSComm1.PortOpen = True
'la siguiente instrucción no es necesaria
'La pongo solamente para que salga el OK que significa que
'el modem se entiende con el PC
MSComm1.Output = "AT" & Chr(13)
End Sub
Private Sub Form_Load()
End Sub
Private Sub MSComm1_OnComm()
'En esta parte realiza la detección mediante los datos que recibe
'por la entrada serie (Dos veces la palabra RING)
If Check1.Value = False Then
Static salida As String
Dim entrada As String
Dim I As Integer
Dim A As String
If MSComm1.CommEvent = comEvReceive Then
entrada = MSComm1.Input
For I = 1 To Len(entrada)
A = Mid(entrada, I, 1)
'la siguiente instrucción escribe lo que recibes del puerto serie en
'el text box Text1
Text1 = Text1 & A
If Asc(A) > 32 Then
salida = salida & A
End If
Next I
salida = Right(salida, 8)
If UCase(salida) = "RINGRING" Then
Label3.Caption = "HAN SONADO DOS TIMBRAZOS"
End If
End If
Else
'Aqui el código para recibirlo por la línea RING (Pin 22 del puerto
'si es de 25 pines. Si es de 9 ni lo intentes porque no tiene
Static contador As Integer
If MSComm1.CommEvent = comEvRing Then
contador = contador + 1
End If
If contador = 2 Then
contador = 0 'lo dejas preparado para la próxima llamada
' AKI tu código. El mío pone en la etiqueta Label3 "HAN SONADO 2 TIMBRAZOS"
Label3.Caption = "HAN SONADO 2 TIMBRAZOS"
End If
End If
End Sub
Private Sub Text2_Change()
End Sub
Form=ring1.frm
Reference=*\G{BEF6E001-A874-101A-8BBA-00AA00300CAB}#2.0#0#C:\WINDOWS\SYSTEM\OLEPRO32.DLL#Standard OLE Types
Reference=*\G{00025E01-0000-0000-C000-000000000046}#3.0#0#C:\ARCHIVOS DE PROGRAMA\ARCHIVOS COMUNES\MICROSOC:\ARCHIVOS DE PROGRAMA\A#Microsoft DAO 3.0 Object Library
Object={648A5603-2C6E-101B-82B6-000000000014}#1.1#0; MSCOMM32.OCX
ProjWinSize=149,382,225,174
ProjWinShow=0
IconForm="Form1"
HelpFile=""
Name="Proyect1"
HelpContextID="0"
StartMode=0
VersionCompatible32="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionCompanyName="MINISTERIO DE ASUNTOS EXTERIORES"