CONTROL PUERTO SERIE

Anuncio
Estudio y realización de un enlace Bluetooth para el sistema de
desarrollo basado en el MC68HC11
149
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
desarrollo basado en el MC68HC11
II.1
150
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
desarrollo basado en el MC68HC11
151
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
desarrollo basado en el MC68HC11
152
'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
desarrollo basado en el MC68HC11
txtRecepcionAsc.Height = 1095
153
'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
txtRecepcionHex.Top = 240
'Ocultamos la ventana Ascii.
'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
desarrollo basado en el MC68HC11
154
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
desarrollo basado en el MC68HC11
155
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
desarrollo basado en el MC68HC11
156
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
desarrollo basado en el MC68HC11
157
'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
desarrollo basado en el MC68HC11
158
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
desarrollo basado en el MC68HC11
159
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
desarrollo basado en el MC68HC11
160
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
b = b - 48
Else
b = b - 55
'Si es un número.
'Valor decimal del número hexadecimal.
'Si es una letra.
'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
desarrollo basado en el MC68HC11
161
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
desarrollo basado en el MC68HC11
162
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
Descargar