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