Está en la página 1de 14

Estudio y realización de un enlace Bluetooth para el sistema de 149

desarrollo basado en el MC68HC11

ANEXO II

CONTROL PUERTO SERIE

El programa Control Puerto Serie ha sido creado en Visual Basic 6.0 y


permite configurar y usar el puerto serie. Consta de un formulario que es la
interfaz del programa.

Ilustración II-1: interfaz del programa Control Puerto Serie.

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 150
desarrollo basado en el MC68HC11

II.1 Descripción de la interfaz

La interfaz consta de cuatro marcos: puerto, velocidad, transmisión y


recepción.

• Puerto: aquí elegimos el puerto que se va a utilizar. Es posible elegir un


puerto distinto escribiéndolo en el mismo cuadro de texto. Una vez
elegido, el puerto se abre al pulsar el botón ‘Abrir’. Inmediatamente este
botón cambia su título por ‘Cerrar’, ya que para abrir otro puerto
tendremos que cerrar este previamente. Bajo este marco se hallan dos
botones que permiten activar o desactivar las líneas RTS y DTR, que
controlan las señales RESET y XIRQ de la tarjeta de desarrollo del
MC68HC11. Estos botones permanecen deshabilitados mientras el
puerto está cerrado.

• Velocidad: podemos optar por cinco velocidades de transmisión, que se


seleccionan al elegirlas con el ratón, o bien podemos escribir la velocidad
deseada en el mismo cuadro. En este caso, la velocidad escrita se
selecciona al pulsar el botón ‘Seleccionar’. La velocidad escrita queda
guardada en el menú desplegable.

• Transmisión: en este marco podemos escribir cadenas de texto para


enviarlas por el puerto serie. En el cuadro superior podemos escribir
texto ASCII estándar. Lo que escribamos queda guardado en el menú
desplegable. En el inferior podemos escribir códigos hexadecimales. Las
cajas de selección permiten añadir los caracteres <CR> ($0D en
hexadecimal) y <LF> ($0A en hexadecimal). El botón ‘Enviar’ permanece
deshabilitado mientras el puerto está cerrado. Al pulsarlo se envía el
contenido de la caja ASCII seguido del contenido de la caja hexadecimal
y los caracteres especiales que hallamos marcados. Pulsando ‘Borrar’
borramos el contenido de las cajas de texto.

• Recepción: los caracteres recibidos son representados en los cuadros de


texto de este marco. Podemos ver los caracteres en formato
hexadecimal, ASCII o ambos a la vez pulsando el botón situado bajo
‘Borrar’. El título de este botón nos indica el formato que aparecerá al

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 151
desarrollo basado en el MC68HC11

pulsarlo. Cuando visualizamos ambos formatos a la vez, existe una


correspondencia entre las líneas de ambos cuadros, es decir, se
representan los mismos caracteres en las mismas líneas de los dos
cuadros, aunque una línea está en formato ASCII y la otra en
hexadecimal. El botón ‘Borrar’ borra el contenido de ambos cuadros de
texto.

II.2 Listado de códigos del programa Control Puerto Serie

El programa Control Puerto Serie consta de un formulario con los


controles necesarios para el manejo del puerto serie y un módulo con diversas
funciones necesarias para el programa.

II.2.1 Código del formulario principal

El listado del código del formulario principal es el siguiente:

Public num_car As Integer 'número de caracteres recibidos por el


'puerto serie antes de completar una línea
'de las ventanas de recepción Ascii/Hex.
Public num_car_Asc As Integer 'número de caracteres recibidos por el
'puerto serie antes de completar una
'línea en las ventanas de recepción
'Ascii y Hex.
Public textoAsc As String 'caracteres recibidos que se representan
'en la ventana Ascii.
Public textoHex As String 'caracteres recibidos que se representan
'en la ventana Hex.
Public textoAsc_Cr As String 'caracteres recibidos que se representan
'en la parte Ascii de las ventanas
'Ascii/Hex.
Public textoHex_Cr As String 'caracteres recibidos que se representan
'en la parte Hex de las ventanas
'Ascii/Hex.

Private Sub cboVelocidad_Click()

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 152
desarrollo basado en el MC68HC11

'Se selecciona la velocidad del puerto serie utilizado.

comControl.Settings = cboVelocidad.Text & ",n,8,1"

End Sub

Private Sub cmdAbrirPuerto_Click()

'Este procedimiento abre o cierra el puerto serie, según en qué


'estado se encuentre. Además habilita o deshabilita las líneas
'RTS, DTR y el botón Enviar.

If comControl.PortOpen = False Then


'Selecciona el puerto.
comControl.CommPort = Val(Right(cboPuerto.Text, 1))
comControl.PortOpen = True
'Una vez abierto el puerto, sólo podremos cerrarlo.
cmdAbrirPuerto.Caption = "Cerrar"
cmdRTS.Enabled = True
cmdDTR.Enabled = True
cmdEnviar.Enabled = True
Else
comControl.PortOpen = False 'Si estaba abierto lo cerramos.
cmdAbrirPuerto.Caption = "Abrir" 'Una vez cerrado, sólo
'podemos abrirlo.
cmdRTS.Enabled = False
cmdDTR.Enabled = False
cmdEnviar.Enabled = False
End If

End Sub

Private Sub cmdAsciiHex_Click()

'Este procedimiento permite ver los caracteres recibidos como


'caracteres Ascii, caracteres hexadecimales o ambas
'representaciones.

If cmdAsciiHex.Caption = "Ascii/Hex" Then 'Para ver la ventana


'Ascii/Hex.
cmdAsciiHex.Caption = "Hex"

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 153
desarrollo basado en el MC68HC11

txtRecepcionAsc.Height = 1095 'Cambiamos el tamaño de la


'ventana Ascii.
txtRecepcionAsc.Width = 3795
txtRecepcionHex.Visible = True 'Hacemos visible la ventana
'Hex.
txtRecepcionAsc.Text = textoAsc_Cr 'Representamos los
'caracteres recibidos en
'la ventana Ascii.
txtRecepcionHex.Text = textoHex_Cr 'Representamos los
'caracteres recibidos en
'la ventana Hex.
'Situamos el cursor al final de la cadena, para añadir
'caracteres a continuación.

txtRecepcionAsc.SelStart = Len(txtRecepcionAsc.Text)
txtRecepcionHex.SelStart = Len(txtRecepcionHex.Text)
ElseIf cmdAsciiHex.Caption = "Hex" Then 'Para ver la ventana Hex.
cmdAsciiHex.Caption = "Ascii"
txtRecepcionAsc.Visible = False 'Ocultamos la ventana Ascii.
txtRecepcionHex.Top = 240 'Establecemos el tamaño y posición
'de la ventana Hex.
txtRecepcionHex.Left = 120
txtRecepcionHex.Height = 2535
txtRecepcionHex.Width = 6015
txtRecepcionHex.Visible = True 'Hacemos visible la ventana
'Hex.
txtRecepcionHex.Text = textoHex 'Representamos los caracteres
'Hex.
txtRecepcionHex.SelStart = Len(txtRecepcionHex.Text)
Else
cmdAsciiHex.Caption = "Ascii/Hex" 'Para ver la ventana Ascii.
txtRecepcionHex.Visible = False 'Ocultamos la ventana Hex.
txtRecepcionAsc.Height = 2535 'Ajustamos el tamaño de la
'ventana Ascii.
txtRecepcionAsc.Width = 6015
txtRecepcionAsc.Visible = True 'Hacemos visible la ventana
'Ascii.
txtRecepcionHex.Top = 1560 'Ajustamos la posición de la
'ventana Hex.
txtRecepcionHex.Left = 120
txtRecepcionHex.Height = 1095

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 154
desarrollo basado en el MC68HC11

txtRecepcionHex.Width = 7095
txtRecepcionAsc.Text = textoAsc 'Representamos los caracteres
'Ascii.
txtRecepcionAsc.SelStart = Len(txtRecepcionAsc.Text)
End If

End Sub

Private Sub cmdBorrarRx_Click()

'Borramos el contenido de las ventanas de recepción. Además


'inicializamos las variables de número de caracteres recibidos.

textoAsc = ""
textoHex = ""
textoAsc_Cr = ""
textoHex_Cr = ""
txtRecepcionAsc.Text = ""
txtRecepcionHex.Text = ""
num_car = 0
num_car_Asc = 0

End Sub

Private Sub cmdBorrarTx_Click()

'Borramos el contenido de las ventanas de tansmisión.

cboEnvioAsc.Text = ""
txtEnvioHex.Text = ""

End Sub

Private Sub cmdDTR_Click()

'Habilitamos o deshabilitamos, según su estado, la línea DTR.

If comControl.DTREnable = True Then


cmdDTR.Caption = "DTR ON"
comControl.DTREnable = False
Else

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 155
desarrollo basado en el MC68HC11

cmdDTR.Caption = "DTR OFF"


comControl.DTREnable = True
End If

End Sub

Private Sub cmdEnviar_Click()

'Enviamos por el puerto serie el contenido de las ventanas de


'transmisión y los caracteres especiales, si están habilitados.

Dim existe As Boolean: existe = False


comControl.Output = cboEnvioAsc.Text & _
convHex_Ascii(txtEnvioHex.Text) & car_CRLF
For i = 0 To cboEnvioAsc.ListCount

'Si el contenido de la ventana Ascii no se había transmitido


'anteriormente, lo guardamos.

If cboEnvioAsc.Text = cboEnvioAsc.List(i) Then


existe = True
End If
Next i
If existe = False Then
cboEnvioAsc.AddItem cboEnvioAsc.Text
End If

End Sub

Private Sub cmdRTS_Click()

'Habilitamos o deshabilitamos, según su estado, la línea RTS.

If comControl.RTSEnable = True Then


cmdRTS.Caption = "RTS ON"
comControl.RTSEnable = False
Else
cmdRTS.Caption = "RTS OFF"
comControl.RTSEnable = True
End If

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 156
desarrollo basado en el MC68HC11

End Sub

Private Sub cmdSelecVel_Click()

'Establecemos la velocidad del puerto serie.

Dim existe As Boolean: existe = False


comControl.Settings = cboVelocidad.Text & ",n,8,1"
For i = 1 To cboVelocidad.ListCount

'Si la velocidad no se encuentra en la lista, la añadimos.

If cboVelocidad.Text = cboVelocidad.List(i) Then


existe = True
End If
Next i
If existe = False Then
cboVelocidad.AddItem cboVelocidad.Text
End If

End Sub

Private Sub comControl_OnComm()

'Cuando se recibe un carácter o cadena de caracteres por el puerto


'serie, los almacenamos en las variables que representan el
'contenido de las ventanas de recepción.

Dim i As Integer
Dim cad_rx As String 'cadena recibida por el puerto serie.
Dim car_rx_Asc As String 'Representación Ascii de un carácter
'de la cadena recibida.
Dim car_rx_Hex As String 'Representación hexadecimal de un
'carácter de la cadena recibida.
If comControl.CommEvent = comEvReceive Then 'Se ha recibido una
'cadena.
cad_rx = comControl.Input
For i = 1 To Len(cad_rx)

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 157
desarrollo basado en el MC68HC11

'Añadimos un carácter en representación Ascii a la cadena


'de la ventana de recepción Ascii.

textoAsc = textoAsc & Extrae_car_Asc(cad_rx, i)

'Añadimos un carácter en representación Ascii a la cadena


'de la ventana de recepción Ascii/Hex.

textoAsc_Cr = textoAsc_Cr & Extrae_car_Asc(cad_rx, i)

'Añadimos un carácter en representación Hex a la cadena de


'la ventana de recepción Hex.

textoHex = textoHex & Extrae_car_Hex(cad_rx, i)

'Añadimos un carácter en representación Hex a la cadena de


'la ventana de recepción Ascii/Hex.

textoHex_Cr = textoHex_Cr & Extrae_car_Hex(cad_rx, i)


num_car = num_car + 1
num_car_Asc = num_car_Asc + 1

'Si hemos recibido una cadena <CR><LF> estamos en una


'nueva línea de las ventanas Ascii.

If Right(textoAsc, 2) = vbCrLf Then


num_car_Asc = 0
End If

'Cuando hemos recibido 53 caracteres en la ventana de


'recepción Ascii, saltamos a la siguiente línea.

If num_car_Asc = 53 Then
textoAsc = textoAsc & vbCrLf
num_car_Asc = 0
End If

'Si hemos recibido una cadena "0D0A" estamos en una nueva


'línea de la ventana Hex de la representación Ascii/Hex.

If Right(textoHex, 4) = "0D0A" Then

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 158
desarrollo basado en el MC68HC11

textoHex_Cr = textoHex_Cr & vbCrLf


num_car = 0
End If

'Si hemos recibido 32 caracteres en las ventanas de


'recepción Ascii/Hex, saltamos a la siguiente línea.

If num_car = 32 Then
textoAsc_Cr = textoAsc_Cr & vbCrLf
textoHex_Cr = textoHex_Cr & vbCrLf
num_car = 0
End If
Next i

'Representamos las cadenas recibidas en las ventanas de


'recepción que correspondan, según la selección del botón
'Ascii/Hex.

If cmdAsciiHex.Caption = "Hex" Then


txtRecepcionAsc.Text = textoAsc_Cr
txtRecepcionHex.Text = textoHex_Cr
Else
txtRecepcionAsc.Text = textoAsc
txtRecepcionHex.Text = textoHex
End If

'Situamos el cursor al final de las cadenas de las ventanas.

txtRecepcionAsc.SelStart = Len(txtRecepcionAsc.Text)
txtRecepcionHex.SelStart = Len(txtRecepcionHex.Text)
End If

End Sub

Private Sub Form_Load()

'Al iniciar la aplicación establecemos los valores iniciales de


'variables y propiedades.

num_car = 0
num_car_Asc = 0

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 159
desarrollo basado en el MC68HC11

textoAsc = ""
textoHex = ""
txtRecepcionAsc.Height = 2535
txtRecepcionAsc.Width = 6015

'Establecemos el título del botón RTS según el estado de la línea


'RTS.

If comControl.RTSEnable = False Then


cmdRTS.Caption = "RTS ON"
Else
cmdRTS.Caption = "RTS OFF"
End If

'Establecemos el título del botón DTR según el estado de la línea


'DTR.

If comControl.DTREnable = False Then


cmdDTR.Caption = "DTR ON"
Else
cmdDTR.Caption = "DTR OFF"
End If

'Inicialmente el puerto esta cerrado, por lo que deshabilitamos


'los botones RTS, DTR y Enviar.

cmdRTS.Enabled = False
cmdDTR.Enabled = False
cmdEnviar.Enabled = False

End Sub

Private Sub txtEnvioHex_Change()

'Si escribimos algo en la ventana de transmisión hexadecimal, lo


'ponemos en mayúsculas y situamos el cursor al final del texto.

txtEnvioHex.Text = UCase(txtEnvioHex.Text)
txtEnvioHex.SelStart = Len(txtEnvioHex.Text)

End Sub

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 160
desarrollo basado en el MC68HC11

II.2.2 Código del módulo mod_conversion

Este módulo consta de cuatro funciones:

Function convHex_Ascii(cadena_in As String) As String

'Esta función convierte cada pareja de números hexadecimales de


'una cadena en una cadena de caracteres ASCII a los que
'representan las parejas de números hexadecimales.

Dim valor_dec As Integer: valor_dec = 0 'Valor decimal de un


'número hexadecimal de dos
'cifras.
Dim a As Boolean: a = True 'Indica si consideramos la unidad
'(False) o la decena (True) de un
'número hexadecimal de dos cifras.
Dim b As Integer 'valor decimal temporal del número
'hexadecimal.
convHex_Ascii = ""
For i = 1 To Len(cadena_in)
b = Asc(Mid(cadena_in, i, 1)) 'Código ASCII de un carácter
'de la cadena.
If b < 58 Then 'Si es un número.
b = b - 48 'Valor decimal del número hexadecimal.
Else 'Si es una letra.
b = b - 55 'Valor decimal del número hexadecimal.
End If
If a = True Then 'Si es la decena multiplicamos por 16.
valor_dec = b * 16
a = False 'El próximo será la unidad.
Else
valor_dec = valor_dec + b 'Si es la unidad lo sumamos a
'lo que ya teníamos.

'Ahora obtenemos el carácter ASCII del número decimal y lo


'añadimos a la cadena.

convHex_Ascii = convHex_Ascii & Chr(valor_dec)


a = True 'El próximo será la decena.
End If
Next i

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 161
desarrollo basado en el MC68HC11

End Function

Function Extrae_car_Asc(cadena_in As String, num As Integer) As String

'Esta función devuelve el caracter en posición num de la cadena de


'entrada. Si este caracter es el código ASCII 0, lo cambiamos por
'el 1 para evitar que termine la representación de caracteres
'recibidos por el puerto serie.

If Mid(cadena_in, num, 1) = Chr(0) Then


Extrae_car_Asc = Chr(1)
Else
Extrae_car_Asc = Mid(cadena_in, num, 1)
End If
End Function

Function Extrae_car_Hex(cadena_in As String, num As Integer) As String

'Esta función devuelve el número hexadecimal correspondiente al


'código ASCII del caracter de la cadena de entrada situado en
'posición num. Si el número hexadecimal tiene un solo dígito,
'añadimos un 0 al principio.

If Len(CStr((Hex(Asc(Mid(cadena_in, num, 1)))))) = 1 Then


Extrae_car_Hex = "0" _
& CStr((Hex(Asc(Mid(cadena_in, num, 1)))))
Else
Extrae_car_Hex = CStr((Hex(Asc(Mid(cadena_in, num, 1)))))
End If

End Function

Function car_CRLF() As String

'Esta función devuelve los caracteres <CR>, <LF> o <CR><LF> en


'función de lo que esté marcado en los cuadros de selección del
'marco Transmisión.

If frmPuertoSerie.chkCR.Value = 0 Then
If frmPuertoSerie.chkLF.Value = 0 Then

Ingeniería de Telecomunicación Iván Cuenca Zaldívar


Estudio y realización de un enlace Bluetooth para el sistema de 162
desarrollo basado en el MC68HC11

car_CRLF = ""
Else
car_CRLF = Chr(10)
End If
Else
If frmPuertoSerie.chkLF.Value = 0 Then
car_CRLF = Chr(13)
Else
car_CRLF = Chr(13) & Chr(10)
End If
End If

End Function

Ingeniería de Telecomunicación Iván Cuenca Zaldívar

También podría gustarte