Sólo Programadores Banner 468x60
Este mes en Sólo Programadores
Contenido del CD-ROM
Índice temático
Suscripción

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 BBS’s 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


Banner 468x60
Explorer 4.0, Netscape 4.0. Resolución 800 x 600.
©Tower Communications 1.998.
Diseño: GRUPO ALBERTINA DE COMUNICACION.