Principales respuestas
Problemas con los fomularios

Pregunta
-
Hola a todos
Soy novato en la programación en Visual Basic 2005 y estoy realizando una aplicación que se comunica a través del puerto serie. El programa consta de dos fomularios, uno principal y otro para introducirle una clave. El problema es que cuando el programa principal llama al formulario para introducir la clave, este último se abre (si es que llega a eso, que a veces no lo consigo) pero no me deja escribir nada y el programa se cuelga. ¿Alguién puede darme una idea de lo que sucede?
Gracias y un saludo
- Cambiado Toni Recio [Techdencias] martes, 26 de mayo de 2009 9:44 ([Loc]From:Lenguaje VB.NET)
Respuestas
Todas las respuestas
-
-
Hola Toni
Tienes razón, así poco se puede entender. Aquí os dejo un trozo del formulario principal y el formulario secundario entero. Es bastante largo, pero bueno. Espero que ahora aclare un poco el problema.
****************************** FORMULARIO PRINCIPAL ***************************************
Imports System
Imports System.IO.PortsPublic Class MainProgram
Public WithEvents RS232 As New SerialPort
Delegate Sub WriteDataDelegate(ByVal str As String)
Private strData As String = "" 'Recepcion de datos'*********************************************************************************
Private Sub MainProgram_Load(ByVal sender As System.Object, ByVal _
e As System.EventArgs) Handles MyBase.LoadWith RS232
.PortName = "COM1"
.BaudRate = 9600
.Parity = Parity.None
.DataBits = 8
.StopBits = StopBits.One
End WithRS232.ReadTimeout = 500
RS232.WriteTimeout = 500ConexionEstablecer.Enabled = True
ConexionCortar.Enabled = FalseEnd Sub
'*********************************************************************************Private Sub ConexionEstablecer_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles ConexionEstablecer.ClickConexionEstablecer.Enabled = False
ConexionCortar.Enabled = TrueTry
RS232.Open()
txtRX.AppendText(RS232.PortName & " abierto a las " & Now.ToString & vbCrLf)Catch ex As System.IO.IOException
txtRX.AppendText("Error abriendo el puerto: " & vbCrLf & ex.Message & vbCrLf)
Catch ex As System.UnauthorizedAccessException
txtRX.AppendText("El pueto ya esta abierto: " & vbCrLf & ex.Message & vbCrLf)
Catch ex As System.Exception
txtRX.AppendText("Error general accediendo al puerto:" & vbCrLf & ex.Message & vbCrLf)
End TryEnd Sub
'*********************************************************************************Private Sub ConexionCortar_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles ConexionCortar.ClickRS232.Close()
Timer1.Stop()
txtRX.AppendText(RS232.PortName & " cerrado a las " & Now.ToString & vbCrLf)
ConexionEstablecer.Enabled = True ' Recurso accionable
ConexionCortar.Enabled = False ' Recurso no accionableEnd Sub
'*********************************************************************************Private Sub ConexionSalir_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles ConexionSalir.ClickIf RS232.IsOpen Then
RS232.Close()
End IfMe.Dispose()
End Sub
'*********************************************************************************Public Sub RS232_DataReceived(ByVal sender As Object, ByVal e _
As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceivedstrData = RS232.ReadExisting
strReceived += strData
Dim WriteInvoke As New WriteDataDelegate(AddressOf Me.WriteData)Me.Invoke(WriteInvoke, strData)
End Sub
'*********************************************************************************Public Sub WriteData(ByVal str As String)
txtRX.AppendText(str)
End Sub
'*********************************************************************************Private Sub cmdEnviar_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles cmdEnviar.Click' Establecemos el modo de anuncio de errores
strSend = "AT+CMEE=2" + vbCr
ManagementRaster() ' Enviamos la Trama
MobileEquipmentError() ' Tratamiendo de la respuesta' Preguntamos si el PIN ´se ha introducido
My.Forms.PIN_Code.Show()
End Sub
'*********************************************************************************' INCIALIZAMOS EL TIMER2 PARA ESPERA
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
TimeOutCount = TimeOutCount + 1 ' Actualizamos el contador
If TimeOutCount = 10 Then ' Tiempo de espera máximo de 70 segundos
Timer1.Stop() ' Deshabilitamos el Timer
TimeOutCount = 0 ' Reiniciamos la variable del contador
TimeOut = True
End IfEnd Sub
'*********************************************************************************End Class
****************************** FORMULARIO PIN_Code ***************************************
Public Class PIN_Code
' Declaración de variables locales para esta clase
Public KeyAscii As Integer
'*********************************************************************************
' CARGAMOS EL FORMULARIO
Private Sub PIN_Code_Load(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles MyBase.LoadtxtPIN.Text = "" ' Borramos el texto de la caja PIN.
End Sub
'*********************************************************************************' Código PIN solo admite valores numéricos. Permitimos tecla borrar (ASCII 8)
Private Sub txtPIN_KeyPress(ByVal sender As Object, ByVal e _
As System.Windows.Forms.KeyPressEventArgs) Handles txtPIN.KeyPressIf (KeyAscii <> 8) And (KeyAscii < 48 Or KeyAscii > 57) Then
KeyAscii = 0
End IfEnd Sub
'*********************************************************************************' Envio de la trama del código PIN y tratamiento de la respuesta obtenida
Private Sub bttAceptar_Click(ByVal sender As Object, ByVal e _
As System.EventArgs) Handles bttAceptar.ClickDim PIN As String
If txtPIN.Text = "" Then ' Confirmamos si txtPIN está en blanco
MsgBox("Introduzca el código PIN en la caja de texto")
Exit Sub ' Salimos de la rutina
End IfPIN = Chr(34) + txtPIN.Text + Chr(34) ' Código PIN entre comillas
strSend = "AT+CPIN=" + PIN + vbCr
ManagementRaster() ' Enviamos la trama
TreatPIN_Code() ' Tratamos la respuestaEnd Sub
'*********************************************************************************' Salida del programa
Private Sub bttCancelar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bttCancelar.Click
Me.Dispose() ' Salimos del programa
End Sub
'*********************************************************************************End Class
-
Yo creo que el problema lo tienes en la instrucción que pretende mostrar el formulario de introducción de la clave:
Code SnippetMy.Forms.PIN_Code.Show()Tal y como yo lo veo, tendrías que hacer algo parecido a esto:
Code SnippetDim frmPIN as New PIN_CODE
frmPIN.Show()
Es decir, instanciar la clase, y trabajar con el objeto resultante, en lugar de atacar directamente la clase.
Si tienes un segundo pruébalo y lo comentas.
Un saludo!
-
Hola Toni.
Esa opción ya la probé y tenía los mismos resultado, no obstante he vuelto a probarla sin exito. Si quieres te paso una captura de pantalla para que veas como queda la ventana del código PIN. A lo mejor te da una idea.
Gracias por tu ayuda
-
He intentado reproducir los formularios todo lo fielmente que me ha sido posible, pero no soy capaz de reproducir la incidencia. A mí me funciona correctamente.
En mi opinión el problema debe residir en las dos rutinas que invocas antes de mostrar el formulario del PIN:
Code SnippetManagementRaster() ' Enviamos la Trama
MobileEquipmentError() ' Tratamiendo de la respuestaPrueba de comentarlas un segundo y a ver si el formulario se muestra sin problemas.
Si posteas el código de estas dos funciones quizás pueda ver algo...
-
Aquí te las dejo, un sauldo
Module
Procedures ' MàDULO DE DECLARACIàN DE ACCIONES DE ENVÖO DE TRAMA ' Declaraci¢n de variables locales para este m¢dulo Private aux As Integer 'Private straux As String '*********************************************************************************SendCommand()
InicTimerOut()
WaitResultCode()
Time_Out()
End Sub '*********************************************************************************aux = 0
' Variable de control de respuesta completafrmMAIN.RS232.WriteLine(strSend)
' Introduce en el buffer el comando AT End Sub '*********************************************************************************TimeOutCount = 0
' Reiniciamos variable de controlfrmMAIN.Timer1.Start()
' Activamos el Timer End Sub '*********************************************************************************MsgBox(
"Error de Timeout") ' + vbCrLf + _ ' Si lo pongo entero me da error '"Compruebe que el modem est‚ encendido correctamente y ejecute de nuevo el programa" _ '+ vbOKOnly + vbCritical) End ' Finalizamos el programa. Ocurri¢ error en el modem ElsefrmMAIN.Timer1.Stop()
TimeOutCount = 0
TimeOut =
False End If End Sub '*********************************************************************************strSend =
"AT+CPIN?" + vbCr ' Preparamos la tramaSendCommand()
' Enviamos comandoInicTimerOut()
' Inicializamos el Timer Do ' Comparaci¢n completa de la respuesta Select Case strReceived ' Tratamiento de la respuesta: SISTEMA PREPARADO Case strSend + vbCrLf + "+CPIN: " + "READY" + vbCrLf + vbCrLf + "OK" + vbCrLfMsgBox(
"Sistema preparado", vbOKOnly + vbInformation) ' Mensaje de controlstrReceived =
"" ' Vaciamos el contenido (lectura del buffer)frmMAIN.Show()
' Mostramos la Ventana Principalaux = 1
' Tratamiento de la respuesta: NECESARIO CODIGO PIN Case strSend + vbCrLf + "+CPIN: " + "SIM PIN" + vbCrLf + vbCrLf + "OK" + vbCrLfMsgBox(
"Es necesario que introduzca el c¢digo PIN", vbOKOnly + vbInformation)strReceived =
"" ' Vaciamos el contenido (lectura del buffer)frmMAIN.Hide()
' Impedimos la actuaci¢n sobre la ventanafrmPIN.Show()
' Mostramos el formulario de introducci¢n del PINaux = 1
' Tratamiento de la respuesta: NECESARIO CODIGO PUK Case strSend + vbCrLf + "+CPIN: " + "SIM PUK" + vbCrLf + vbCrLf + "OK" + vbCrLfMsgBox(
"Es necesario que introduzca el c¢digo PUK", vbOKOnly + vbInformation)strReceived =
"" ' Vaciamos el contenido (lectura del buffer)frmMAIN.Hide()
' Impedimos la actuaci¢n sobre la ventana 'frmPUK.Show() ' Mostramos el formulario de introducci¢n del PINaux = 1
' Tratamiento de la respuesta: SIM NO INSERTADO Case strSend + vbCrLf + "+CME ERROR: SIM not inserted" + vbCrLfMsgBox(
"Introduzca la tarjeta SIM y pulse Aceptar", vbOKOnly + vbExclamation)strReceived =
"" ' Vaciamos el contenido (lectura del buffer)frmMAIN.Hide()
' Impedimos la actuaci¢n sobre la ventanaaux = 1
End Select Loop Until (aux = 1 Or TimeOut) ' Condiciones de salida (Respuesta completa o TimeOut)Time_Out()
' Se produjo Timeout?. Tratamos el mismo End Sub '*********************************************************************************End
ModuleModule
TreatResponse ' MàDULO DE DECLARACIàN DE TRATAMIENTO DE LAS RESPUESTAS '*********************************************************************************MsgBox(
"La configuraci¢n de errores se ha establecido correctamente", _vbOKOnly + vbInformation)
Case "ERROR"MsgBox(
"Error en la trama de configuraci¢n de errores. Revise el Modem", _vbOKOnly + vbCritical)
End End SelectstrReceived =
"" End Sub'*********************************************************************************
' TRATAMIENTO DE LA RESPUESTA AT+CPIN=PIN
' Comprobamos si el PIN es correcto Public Sub TreatPIN_Code() Dim frmMAIN As New MainProgram Dim frmPIN As New PIN_Code Select Case ResultCode() Case "OK"MsgBox(
"El c¢digo PIN introducido es correcto", vbOKOnly _+ vbInformation)
frmMAIN.Show()
frmPIN.Hide()
Case "+CME ERROR: Incorrect password"MsgBox(
"El c¢digo PIN introducido es incorrecto", vbOKOnly _+ vbExclamation)
frmPIN.txtPIN.Text =
""frmPIN.Focus()
Case "+CME ERROR: SIM PUK required"MsgBox(
"El c¢digo PIN introducido es incorrecto", +vbCrLf _+
"Introduzca el c¢digo PUK", vbOKOnly + vbExclamation) 'frmPUK.Show() End SelectstrReceived =
"" End Sub'*********************************************************************************
Str2 = vbCr + vbCrLf
Str3 = vbCrLf
' Proceso de discriminaci¢n del mensajestraux1 = Mid(strReceived, InStr(strReceived, Str2) + 3)
straux2 = Mid(strReceived, InStr(strReceived, Str2) + 3, InStr(straux1, Str3) + (-1))
ResultCode = straux2
' Devuelve el mensaje End FunctionEnd Module -
El siguiente fragmento de código puede ser muy descriptivo para tratar de comentar los problemas que estás teniendo:
Code Snippet' Inicializaci¢n del Timer para el control del TimeOut
Public Sub InicTimerOut() Dim frmMAIN As New MainProgramTimeOutCount = 0
' Reiniciamos variable de controlfrmMAIN.Timer1.Start()
' Activamos el Timer End Sub '*********************************************************************************Estás intentando acceder a un componente de un formulario desde un módulo, y usando la clase del mismo, para crear otra instancia del formulario que no muestras, con lo que tienes dos "ventanas principales", aunque solo muestras una... un poco lio vamos...
Tienes dos opciones:
1. O pasar una referencia del componente Timer como parámetro de la rutina.
2. O convertir el módulo en una clase que se instancie desde el programa principal.
Tal como lo haces, jamás se dispara el Timer, con lo que nunca se produce el TimeOut.
Espero haberme explicado.
Un saludo!
-
-
De momento vamos a lo práctico, a que funcione.
Mueve todas las rutinas y funciones de tu módulo Procedimiento dentro de la clase del formulario principal, sacando todas las referencias a éste, ya que no serán necesarias ya que te encontrarás dentro del mismo.
Mira a ver si esto te funciona, y seguimos con el tema.
Te parece?
-
-
-
-
Has sacado todas las referencias a frmMain?
Creo que puedes todavía tener dos instancias de lo mismo, del rollo:
1) Una instancia lee bien, parece que funcione.
2) Otra instancia te da un error de puerto cerrado pq el puerto lo ha abierto otra instancia (1).
Tan solo es una teoría, pero creo que los tiros van por aquí.
-
Creo que están todas en frmMain ya que una vez que copié todo lo que tenía en el modulo de procedimientos, este lo borré.
De todas formas te posteo el MAIN para que lo veas.
Imports
SystemImports
System.IO.PortsPublic
Class MainProgram Public WithEvents RS232 As New SerialPort Delegate Sub WriteDataDelegate(ByVal str As String) Private strData As String = "" 'Recepcion de datos Private aux As Integer '*********************************************************************************e
As System.EventArgs) Handles MyBase.Load With RS232.PortName =
"COM1".BaudRate = 9600
.Parity = Parity.None
.DataBits = 8
.StopBits = StopBits.One
End WithRS232.ReadTimeout = 500
RS232.WriteTimeout = 500
ConexionEstablecer.Enabled =
TrueConexionCortar.Enabled =
False End Sub '*********************************************************************************ConexionEstablecer.Enabled =
FalseConexionCortar.Enabled =
True TryRS232.Open()
txtRX.AppendText(RS232.PortName &
" abierto a las " & Now.ToString & vbCrLf) Catch ex As System.IO.IOExceptiontxtRX.AppendText(
"Error abriendo el puerto: " & vbCrLf & ex.Message & vbCrLf) Catch ex As System.UnauthorizedAccessExceptiontxtRX.AppendText(
"El pueto ya esta abierto: " & vbCrLf & ex.Message & vbCrLf) Catch ex As System.ExceptiontxtRX.AppendText(
"Error general accediendo al puerto:" & vbCrLf & ex.Message & vbCrLf) End Try End Sub '*********************************************************************************RS232.Close()
Timer1.Stop()
txtRX.AppendText(RS232.PortName &
" cerrado a las " & Now.ToString & vbCrLf)ConexionEstablecer.Enabled =
True ' Recurso accionableConexionCortar.Enabled =
False ' Recurso no accionable End Sub '*********************************************************************************RS232.Close()
End If Me.Dispose() End Sub '*********************************************************************************strData = RS232.ReadExisting
strReceived += strData
Dim WriteInvoke As New WriteDataDelegate(AddressOf Me.WriteData) Me.Invoke(WriteInvoke, strData) End Sub '*********************************************************************************txtRX.AppendText(str)
End Sub '********************************************************************************* Private Sub bttSend_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles bttSend.Click ' Establecemos el modo de anuncio de erroresstrSend =
"AT+CMEE=2" + vbCrManagementRaster()
' Enviamos la TramaMobileEquipmentError()
' Tratamiendo de la respuesta ' Preguntamos si el PIN ´se ha introducidoPIN_Control()
' Envio AT+CPIN? + Tratamiento de la respuesta End Sub '*********************************************************************************TimeOutCount = TimeOutCount + 1
' Actualizamos el contador If TimeOutCount = 10 Then ' Tiempo de espera máximo de 70 segundosTimer1.Stop()
' Deshabilitamos el TimerTimeOutCount = 0
' Reiniciamos la variable del contadorTimeOut =
True End If End Sub '*********************************************************************************SendCommand()
InicTimerOut()
WaitResultCode()
Time_Out()
End Sub '*********************************************************************************aux = 0
' Variable de control de respuesta completaRS232.WriteLine(strSend)
' Introduce en el buffer el comando AT End Sub '*********************************************************************************TimeOutCount = 0
' Reiniciamos variable de controlTimer1.Start()
' Activamos el Timer End Sub '*********************************************************************************MsgBox(
"Error de Timeout. Compruebe el modem", +vbOKOnly + vbCritical) End ' Finalizamos el programa. Ocurrió error en el modem ElseTimer1.Stop()
TimeOutCount = 0
TimeOut =
False End If End Sub '*********************************************************************************strSend =
"AT+CPIN?" + vbCr ' Preparamos la tramaSendCommand()
' Enviamos comandoInicTimerOut()
' Inicializamos el Timer Do ' Comparación completa de la respuesta Select Case strReceived ' Tratamiento de la respuesta: SISTEMA PREPARADO Case strSend + vbCrLf + "+CPIN: " + "READY" + vbCrLf + vbCrLf + "OK" + vbCrLfMsgBox(
"Sistema preparado", vbOKOnly + vbInformation) ' Mensaje de controlstrReceived =
"" ' Vaciamos el contenido (lectura del buffer) Me.Show() ' Mostramos la Ventana Principalaux = 1
' Tratamiento de la respuesta: NECESARIO CODIGO PIN Case strSend + vbCrLf + "+CPIN: " + "SIM PIN" + vbCrLf + vbCrLf + "OK" + vbCrLfMsgBox(
"Es necesario que introduzca el código PIN", vbOKOnly + vbInformation)strReceived =
"" ' Vaciamos el contenido (lectura del buffer) 'Me.Enabled = False ' Impedimos la actuación sobre la ventanafrmPIN.Show()
' Mostramos el formulario de introducción del PINaux = 1
' Tratamiento de la respuesta: NECESARIO CODIGO PUK Case strSend + vbCrLf + "+CPIN: " + "SIM PUK" + vbCrLf + vbCrLf + "OK" + vbCrLfMsgBox(
"Es necesario que introduzca el código PUK", vbOKOnly + vbInformation)strReceived =
"" ' Vaciamos el contenido (lectura del buffer) Me.Enabled = False ' Impedimos la actuación sobre la ventana 'frmPUK.Show() ' Mostramos el formulario de introducción del PINaux = 1
' Tratamiento de la respuesta: SIM NO INSERTADO Case strSend + vbCrLf + "+CME ERROR: SIM not inserted" + vbCrLfMsgBox(
"Introduzca la tarjeta SIM y pulse Aceptar", vbOKOnly + vbExclamation)strReceived =
"" ' Vaciamos el contenido (lectura del buffer) Me.Enabled = False ' Impedimos la actuación sobre la ventanaaux = 1
End Select Loop Until (aux = 1 Or TimeOut) ' Condiciones de salida (Respuesta completa o TimeOut)Time_Out()
' Se produjo Timeout?. Tratamos el mismo End Sub '*********************************************************************************End
Class -
A ver que se me ocurre:
Cuando lanzas el formulario del PIN, si lo que quieres es que la siguiente linea no se ejecute hasta que no hayas acabado de introducir el PIN y cerrado su ventana, usa ShowDialog en lugar de Show.
En lo de hacer referencia al formulario principal, me referia a si lo haces desde la pantalla de PIN.
Al final lo sacaremos!!!
-
Hemos sacado bastates cosas, te comento. He probado partes del programa y parece que todo va bien hasta que llegamos a este punto.
Case
strSend + vbCrLf + "+CPIN: " + "SIM PIN" + vbCrLf + vbCrLf + "OK" + vbCrLfMsgBox(
"Es necesario que introduzca el código PIN", vbOKOnly + vbInformation)strReceived =
"" ' Vaciamos el contenido (lectura del buffer)frmPIN.Show()
' Mostramos el formulario de introducción del PIN aux = 1Al aceptar el mensaje (MsgBox) lanza el formulario del PIN. Seguidamente introduzco el PIN y al darle a aceptar genera la excepción que te comenté anteriormente. Otra cosa que sucede es que cuando ejecuto el programa y llego hasta la excepción, si vuelvoa ejecutarlo ya no funciona. Aquí te dejo el código del formulario PIN
Public
Class PIN_Code ' Declaraci¢n de variables locales para esta clase Public KeyAscii As Integer '********************************************************************************* ' CARGAMOS EL FORMULARIO Private Sub PIN_Code_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.LoadtxtPIN.Text =
"" ' Borramos el texto de la caja PIN. End Sub '********************************************************************************* ' C¢digo PIN solo admite valores num‚ricos. Permitimos tecla borrar (ASCII 8) Private Sub txtPIN_KeyPress1(ByVal sender As Object, ByVal e _ As System.Windows.Forms.KeyPressEventArgs) Handles txtPIN.KeyPress If (KeyAscii <> 8) And (KeyAscii < 48 Or KeyAscii > 57) ThenKeyAscii = 0
End If End Sub '********************************************************************************* ' Envio de la trama del c¢digo PIN y tratamiento de la respuesta obtenida Private Sub bttAceptar_Click(ByVal sender As Object, ByVal e _ As System.EventArgs) Handles bttAceptar.Click Dim frmMAIN As New MainProgram Dim PIN As String If txtPIN.Text = "" Then ' Confirmamos si txtPIN est en blancoMsgBox(
"Introduzca el c¢digo PIN en la caja de texto") Exit Sub ' Salimos de la rutina End IfPIN = Chr(34) + txtPIN.Text + Chr(34)
' C¢digo PIN entre comillasstrSend =
"AT+CPIN=" + PIN + vbCrfrmMAIN.ManagementRaster()
' Enviamos la tramaTreatPIN_Code()
' Tratamos la respuesta End Sub '********************************************************************************* ' Salida del programa Private Sub bttCancelar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bttCancelar.Click Dim frmMAIN As New MainProgram Me.Dispose() ' Salimos del programafrmMAIN.Enabled =
True End Sub '*********************************************************************************End
Class -
Kramer Escribió: strReceived = "" ' Vaciamos el contenido (lectura del buffer)
frmPIN.Show()
' Mostramos el formulario de introducción del PIN aux = 1Perdona que insista en este fragmento de código.
Cuando quieres que se ejecute el comando: aux = 1 ? Mientras muestra la pantalla de PIN? O justo cuando la cierres?
Si lo que quieres es poner "aux" a 1 cuando se cierre el formulario PIN, no lo estás mostrando correctamente, ya que deberías abrirlo en modo modal.
frmPIN.Show() -> frmPIN.ShowDialog()
-
Bien, ya parece que ya va funciona. Ahora si abre el formulario del código PIN pero al introducir el número y darle aceptar genera la excepción:
Excepción no controlada en la aplicación. Si hace click en Continuar, la aplicación omitirá este error e intentará continuar. SI hace click en salir la aplicación se cerrará inmediatamente.
El Puerto está cerrado
Voy a seguir investigando. Muchas gracias por tu ayuda Toni
-
Hola:Puedes descargar el manual en pdf sobre VB y puerto serie.Saludo.
http://electronica-pic.blogspot.com