Programación
del módem (III).
A largo de este artículo
mantendremos la evolución de la programación del módem
que comenzamos hace dos entregas. En esta ocasión
conoceremos la posibilidad de una conexión entre la línea
telefónica y el módem.
Introducción básica. Vamos
a continuar el desarrollo del programa que comenzamos en el fascículo
anterior. Se trataba de un programa definido como "terminal".
Este tipo de aplicaciones es muy utilizado por BBSs para la
transferencia de ficheros, así como el envío y recepción
de mensajes.
El programa principal, constaba de
los siguientes módulos y formularios en el proyecto:
Módulos
Vbterm.glo: declara ciertas
variables y llama a una DLL del API Win32.
Formularios
Cansend.frm: es un cuadro de diálogo
que permite al usuario cancelar una operación "Transmitir
archivo de texto". Se trata de un formulario no modal que actúa
como modal permitiendo continuar a otros procesos.
Frmprops.frm: es el formulario
encargado de establecer las configuraciones por defecto.
Vbterm.frm: es el formulario
principal que muestra la interface del programa.
Hasta el momento, hemos desarrollado
el formulario Cansend.frm y el módulo Vbterm.glo
Formulario frmproperties
(frmProps.frm)
Este nuevo formulario, establecerá
las propiedades de conexión con la línea telefónica
y el módem. El primer paso es establecer un par de variables
privadas que nos serán útiles dentro de este módulo
de formulario para asignar el flujo de datos y valores temporales de
Eco.
Private iFlow As Integer, iTempEcho
As Boolean
El siguiente procedimiento nos
servirá para ajustar las configuraciones según la elección
del usuario, cuando determine sus preferencias en las diferentes
selecciones del formulario (frmproperties) representado a continuación:
Sub LoadPropertySettings()
Dim i As Integer, Settings As
String, Offset As Integer
Carga las configuraciones de
puerto
For i = 1 To 16
cboPort.AddItem "Com" &
Trim$(Str$(i))
Next i
Carga las configuraciones de
velocidad
cboSpeed.AddItem "110"
cboSpeed.AddItem "300"
cboSpeed.AddItem "600"
cboSpeed.AddItem "1200"
cboSpeed.AddItem "2400"
cboSpeed.AddItem "4800"
cboSpeed.AddItem "9600"
cboSpeed.AddItem "14400"
cboSpeed.AddItem "19200"
cboSpeed.AddItem "28800"
cboSpeed.AddItem "38400"
cboSpeed.AddItem "56000"
cboSpeed.AddItem "57600"
cboSpeed.AddItem "115200"
cboSpeed.AddItem "128000"
cboSpeed.AddItem "256000"
Carga las configuraciones de
bits de datos
cboDataBits.AddItem "4"
cboDataBits.AddItem "5"
cboDataBits.AddItem "6"
cboDataBits.AddItem "7"
cboDataBits.AddItem "8"
Carga las configuraciones de
paridad
cboParity.AddItem "Even"
cboParity.AddItem "Odd"
cboParity.AddItem "None"
cboParity.AddItem "Mark"
cboParity.AddItem "Space"
Carga las configuraciones de
bits de parada
cboStopBits.AddItem "1"
cboStopBits.AddItem "1.5"
cboStopBits.AddItem "2"
Establece la configuración
predeterminada
Settings =
frmTerminal.MSComm1.Settings
En todos los casos, el
componente más a la derecha de Settings
será un solo carácter,
excepto cuando haya 1,5 bits de parada.
If InStr(Settings, ".") >
0 Then
Offset = 2
Else
Offset = 0
End If
cboSpeed.Text = Left$(Settings,
Len(Settings) - 6 - Offset)
Select Case Mid$(Settings,
Len(Settings) - 4 - Offset, 1)
Case "e"
cboParity.ListIndex = 0
Case "m"
cboParity.ListIndex = 1
Case "n"
cboParity.ListIndex = 2
Case "o"
cboParity.ListIndex = 3
Case "s"
cboParity.ListIndex = 4
End Select
cboDataBits.Text = Mid$(Settings,
Len(Settings) - 2 - Offset, 1)
cboStopBits.Text = Right$(Settings,
1 + Offset)
cboPort.ListIndex =
frmTerminal.MSComm1.CommPort - 1
optFlow(frmTerminal.MSComm1.Handshaking).Value
= True
If Echo Then
optEcho(1).Value = True
Else
optEcho(0).Value = True
End If
End Sub
Este procedimiento servirá
para descargar de memoria el formulario cuando se pulse el botón
"Cancelar". Para ello, utilizaremos la función estándar
de Visual Basic Unload.
Private Sub cmdCancel_Click()
Unload Me
End Sub
Al pulsar sobre el botón "Aceptar"
se generará este procedimiento, el cual se encarga de activar
los datos asignados en las propiedades visuales del formulario. La
variable Oldport tiene establecida la configuración actual del
puerto hasta que no se indique lo contrario; si es el caso, el nuevo
valor se establecerá en Newport.
Private Sub cmdOK_Click()
Dim OldPort As Integer, ReOpen As
Boolean
On Error Resume Next
Echo = iTempEcho
OldPort =
frmTerminal.MSComm1.CommPort
NewPort = cboPort.ListIndex + 1
If NewPort <> OldPort Then
Si cambia el número de puerto, cierra el antiguo.
If frmTerminal.MSComm1.PortOpen
Then
frmTerminal.MSComm1.PortOpen =
False
ReOpen = True
End If
frmTerminal.MSComm1.CommPort =
NewPort Establece el nuevo número de puerto.
Abrimos el puerto
If Err = 0 Then
If ReOpen Then
frmTerminal.MSComm1.PortOpen = True
frmTerminal.mnuOpen.Checked =
frmTerminal.MSComm1.PortOpen
frmTerminal.mnuSendText.Enabled =
frmTerminal.MSComm1.PortOpen
frmTerminal.tbrToolBar.Buttons("TransmitTextFile").Enabled
= frmTerminal.MSComm1.PortOpen
End If
End If
Si se establece un error al
abrir el puerto, se asignará el valor del antiguo (Oldport)
If Err Then
MsgBox Error$, 48
frmTerminal.MSComm1.CommPort =
OldPort
Exit Sub
End If
End If
Asignamos los valores de
velocidad, paridad, bits de datos y
de parada
frmTerminal.MSComm1.Settings =
Trim$(cboSpeed.Text) & "," & Left$(cboParity.Text,
1) _
& "," &
Trim$(cboDataBits.Text) & "," &
Trim$(cboStopBits.Text)
If Err Then
MsgBox Error$, 48
Exit Sub
End If
frmTerminal.MSComm1.Handshaking =
iFlow
If Err Then
MsgBox Error$, 48
Exit Sub
End If
En las siguientes líneas del
procedimiento se utiliza la instrucción estándar de
Visual Basic "SaveSetting". Esta instrucción Guarda o
crea una entrada para una aplicación en el registro de
configuración de Windows. La siguiente tabla muestra sus parámetros
para que tengáis una referencia rápida:
SaveSetting App.Title, "Properties",
"Settings", frmTerminal.MSComm1.Settings
SaveSetting App.Title, "Properties",
"CommPort", frmTerminal.MSComm1.CommPort
SaveSetting App.Title, "Properties",
"Handshaking", frmTerminal.MSComm1.Handshaking
SaveSetting App.Title, "Properties",
"Echo", Echo
Descargamos el formulario
Unload Me
End Sub
Este procedimiento se inicia cuando
se carga el formulario en pantalla. Definiremos propiedades del mismo
así como las propiedades de comunicación establecidas o
por defecto.
Private Sub Form_Load()
Establece el tamaño
del formulario
Me.Left = (Screen.Width - Me.Width)
/ 2
Me.Top = (Screen.Height - Me.Height)
/ 2
Ajusta el tamaño del
marco al control tabstrip
fraSettings.Move
tabSettings.ClientLeft, tabSettings.ClientTop
Se asegura de que el marco
sea el control situado encima
fraSettings.ZOrder
Carga la configuración
actual de las propiedades
LoadPropertySettings
End Sub
Activamos o desactivamos el Eco.
Private Sub optEcho_Click(Index As
Integer)
If Index = 1 Then
iTempEcho = True
Else
iTempEcho = False
End If
End Sub
Seleccionamos el control de flujo a
utilizar.
Private Sub optFlow_Click(Index As
Integer)
iFlow = Index
End Sub
Formulario frmTerminal (vbterm.frm)
Para finalizar nuestro proyecto, tan
sólo nos queda comentar el formulario principal que visualiza
la interfaz al usuario para la utilización del programa. Este
formulario será comentado en este fascículo y el
siguiente debido a su longitud...
Option Explicit
Dim Ret As Integer Entero
auxiliar.
Dim Temp As String Cadena
auxiliar.
Dim hLogFile As Integer
Controlador de archivo de registro abierto.
Dim StartTime As Date
Almacena la hora de inicio del cronómetro del puerto
Private Sub Form_Load()
Dim CommPort As String, Handshaking
As String, Settings As String
On Error Resume Next
Establece el color
predeterminado del terminal
txtTerm.SelLength = Len(txtTerm)
txtTerm.SelText = ""
txtTerm.ForeColor = vbBlue
Establece el título
App.Title = "Terminal de
Visual Basic"
Establece la luz indicadora
de estado
imgNotConnected.ZOrder
Centra el formulario
frmTerminal.Move (Screen.Width -
Width) / 2, (Screen.Height - Height) / 2
Carga la configuración
del registro
Settings = GetSetting(App.Title, "Properties",
"Settings", "")
frmTerminal.MSComm1.Settings]\
If Settings <> ""
Then
MSComm1.Settings = Settings
If Err Then
MsgBox Error$, 48
Exit Sub
End If
End If
CommPort = GetSetting(App.Title, "Properties",
"CommPort", "")
frmTerminal.MSComm1.CommPort
If CommPort <> ""
Then MSComm1.CommPort = CommPort
Handshaking = GetSetting(App.Title,
"Properties", "Handshaking", "") frmTerminal.MSComm1.Handshaking
If Handshaking <> ""
Then
MSComm1.Handshaking = Handshaking
If Err Then
MsgBox Error$, 48
Exit Sub
End If
End If
Echo = GetSetting(App.Title, "Properties",
"Echo", "") Echo
On Error GoTo 0
End Sub
Private Sub Form_Resize()
Cambia el tamaño del
control Term (ventana)
txtTerm.Move 0, tbrToolBar.Height,
frmTerminal.ScaleWidth, frmTerminal.ScaleHeight - sbrStatus.Height -
tbrToolBar.Height
Sitúa la luz
indicadora de estado
Frame1.Left = ScaleWidth -
Frame1.Width * 1.5
End Sub
Private Sub Form_Unload(Cancel As
Integer)
Dim Counter As Long
If MSComm1.PortOpen Then
Se establece una espera de 10
segundos para transmitir los datos.
Counter = Timer + 10
Do While MSComm1.OutBufferCount
Ret = DoEvents()
If Timer > Counter Then
Select Case MsgBox ("Imposible
el envío de datos al receptor", 34)
Cancelar.
Case 3
Cancel = True
Exit Sub
Reintentar.
Case 4
Counter = Timer + 10
Ignorar.
Case 5
Exit Do
End Select
End If
Loop
MSComm1.PortOpen = 0
End If
Si el archivo de registro está
abierto, vuelca y lo cierra.
If hLogFile Then mnuCloseLog_Click
End
End Sub
Private Sub imgConnected_Click()
Llama a la rutina
mnuOpen_Click para alternar entre conectar y desconectar.
Call mnuOpen_Click
End Sub
Private Sub imgNotConnected_Click()
Llama a la rutina
mnuOpen_Click para alternar entre conectar y desconectar.
Call mnuOpen_Click
End Sub
Private Sub mnuCloseLog_Click()
Cierra el archivo de
registro.
Close hLogFile
hLogFile = 0
mnuOpenLog.Enabled = True
tbrToolBar.Buttons("OpenLogFile").Enabled
= True
mnuCloseLog.Enabled = False
tbrToolBar.Buttons("CloseLogFile").Enabled
= False
frmTerminal.Caption = "Terminal
de Visual Basic"
End Sub
Private Sub mnuDial_Click()
On Local Error Resume Next
Static Num As String
Num = "055" Aquí
asignamos el número a marcar por defecto.
Obtiene un número del
usuario.
Num = InputBox$("Escriba el número
de teléfono:", "Marcar número", Num)
If Num = "" Then Exit Sub
Abre el puerto si no lo está
ya.
If Not MSComm1.PortOpen Then
mnuOpen_Click
If Err Then Exit Sub
End If
Habilita el botón de
colgar y el elemento de menú correspondiente.
mnuHangUp.Enabled = True
tbrToolBar.Buttons("HangUpPhone").Enabled
= True
Marca el número.
MSComm1.Output = "ATDT" &
Num & vbCrLf
Inicia el cronómetro
del puerto.
StartTiming
End Sub
Private Sub mnuDTREnable_Click()
Alterna la propiedad
DTREnable
MSComm1.DTREnable = Not
MSComm1.DTREnable
mnuDTREnable.Checked =
MSComm1.DTREnable
End Sub
Private Sub mnuFileExit_Click()
Utiliza Form_Unload, ya que
tiene código para comprobar si hay datos
no enviados y si hay un
archivo de registro abierto.
Form_Unload Ret
Sub
Alterna la propiedad
DTREnable para colgar la línea.
Private Sub mnuHangup_Click()
On Error Resume Next
MSComm1.Output = "ATH"
Envía la cadena de colgar
Ret = MSComm1.DTREnable
Guarda el valor actual.
MSComm1.DTREnable = True
Activa DTR.
MSComm1.DTREnable = False
Desactiva DTR.
MSComm1.DTREnable = Ret
Restablece el valor anterior.
mnuHangUp.Enabled = False
tbrToolBar.Buttons("HangUpPhone").Enabled
= False
Si el puerto continúa
abierto, lo cierra
If MSComm1.PortOpen Then
MSComm1.PortOpen = False
Notifica el error al usuario
If Err Then MsgBox Error$, 48
mnuSendText.Enabled = False
tbrToolBar.Buttons("TransmitTextFile").Enabled
= False
mnuHangUp.Enabled = False
tbrToolBar.Buttons("HangUpPhone").Enabled
= False
mnuDial.Enabled = True
tbrToolBar.Buttons("DialPhoneNumber").Enabled
= True
sbrStatus.Panels("Settings").Text
= "Valores:"
Apaga la luz indicadora y
quita la marca al menú
mnuOpen.Checked = False
imgNotConnected.ZOrder
Detiene el cronómetro
del puerto
StopTiming
sbrStatus.Panels("Status").Text
= "Estado:"
On Error GoTo 0
End Sub |