none
Problemas con los fomularios RRS feed

  • 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  

    sábado, 31 de marzo de 2007 19:45

Respuestas

  • Lo siento, pero no acabo de comprender el problema.

     

    Quizás algún fragmento de código, como por ejemplo las sentencias usadas para mostrar el formulario secundario, nos podrían ser de utilidad de cara a intentar ayudarte.

     

    Un saludo!

    lunes, 2 de abril de 2007 8:24

Todas las respuestas

  • Lo siento, pero no acabo de comprender el problema.

     

    Quizás algún fragmento de código, como por ejemplo las sentencias usadas para mostrar el formulario secundario, nos podrían ser de utilidad de cara a intentar ayudarte.

     

    Un saludo!

    lunes, 2 de abril de 2007 8:24
  • 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.Ports

    Public 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.Load

            With RS232
                .PortName = "COM1"
                .BaudRate = 9600
                .Parity = Parity.None
                .DataBits = 8
                .StopBits = StopBits.One
            End With

            RS232.ReadTimeout = 500
            RS232.WriteTimeout = 500

            ConexionEstablecer.Enabled = True
            ConexionCortar.Enabled = False

        End Sub
        '*********************************************************************************

        Private Sub ConexionEstablecer_Click(ByVal sender As System.Object, ByVal e _
        As System.EventArgs) Handles ConexionEstablecer.Click

            ConexionEstablecer.Enabled = False
            ConexionCortar.Enabled = True

            Try
                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 Try

        End Sub
        '*********************************************************************************

        Private Sub ConexionCortar_Click(ByVal sender As System.Object, ByVal e _
        As System.EventArgs) Handles ConexionCortar.Click

            RS232.Close()
            Timer1.Stop()
            txtRX.AppendText(RS232.PortName & " cerrado a las " & Now.ToString & vbCrLf)
            ConexionEstablecer.Enabled = True   ' Recurso accionable
            ConexionCortar.Enabled = False      ' Recurso no accionable

        End Sub
        '*********************************************************************************

        Private Sub ConexionSalir_Click(ByVal sender As System.Object, ByVal e _
        As System.EventArgs) Handles ConexionSalir.Click

            If RS232.IsOpen Then
                RS232.Close()
            End If

            Me.Dispose()

        End Sub
        '*********************************************************************************

        Public Sub RS232_DataReceived(ByVal sender As Object, ByVal e _
        As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived

            strData = 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 If

        End 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.Load

            txtPIN.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.KeyPress

            If (KeyAscii <> 8) And (KeyAscii < 48 Or KeyAscii > 57) Then
                KeyAscii = 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 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 If

            PIN = Chr(34) + txtPIN.Text + Chr(34)   ' Código PIN entre comillas
            strSend = "AT+CPIN=" + PIN + vbCr
            ManagementRaster()                      ' Enviamos la trama
            TreatPIN_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

            Me.Dispose()     ' Salimos del programa

        End Sub
        '*********************************************************************************

    End Class

    lunes, 2 de abril de 2007 15:05
  • Yo creo que el problema lo tienes en la instrucción que pretende mostrar el formulario de introducción de la clave: 

    Code Snippet
    My.Forms.PIN_Code.Show()

     

    Tal y como yo lo veo, tendrías que hacer algo parecido a esto:

     

    Code Snippet

    Dim 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!

    martes, 3 de abril de 2007 7:06
  • 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

    martes, 3 de abril de 2007 9:09
  • 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 Snippet

    ManagementRaster() ' Enviamos la Trama

    MobileEquipmentError() ' Tratamiendo de la respuesta

     

    Prueba 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...

     

    martes, 3 de abril de 2007 9:39
  • 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

    '*********************************************************************************

     

    ' Acci¢n general de trama. Envia comando, espera respuesta y trata TimeOut

    ' Com£n para todos aquellos comandos cuyo formato de respuesta es tipo A

    ' AT... + <par metros> + Cr + CrLf + mensaje + CrLf

    Public Sub ManagementRaster()

    SendCommand()

    InicTimerOut()

    WaitResultCode()

    Time_Out()

    End Sub

    '*********************************************************************************

     

    ' Envio del comando AT

    Public Sub SendCommand()

    Dim frmMAIN As New MainProgram

    aux = 0 ' Variable de control de respuesta completa

    frmMAIN.RS232.WriteLine(strSend) ' Introduce en el buffer el comando AT

    End Sub

    '*********************************************************************************

     

    ' Inicializaci¢n del Timer para el control del TimeOut

    Public Sub InicTimerOut()

    Dim frmMAIN As New MainProgram

    TimeOutCount = 0 ' Reiniciamos variable de control

    frmMAIN.Timer1.Start() ' Activamos el Timer

    End Sub

    '*********************************************************************************

     

    Public Sub WaitResultCode()

    Do

    Loop Until (InStr(Len(strSend) + 2, strReceived, vbCrLf) Or TimeOut)

    End Sub

    '*********************************************************************************

     

    ' Comprobamos si ha existido un tiempo excesivamente grande para responder.

    ' Si ha ocurrido TimeOut se trata, sino se deshabilita el timer y se reinician los

    ' contadores para el pr¢ximo env¡o de comandos

    Public Sub Time_Out()

    Dim frmMAIN As New MainProgram

    If TimeOut Then

    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

    Else

    frmMAIN.Timer1.Stop()

    TimeOutCount = 0

    TimeOut = False

    End If

    End Sub

    '*********************************************************************************

     

    ' Acci¢n que realiza el control de los c¢digos de acceso

    ' Interroga a la tarjeta SIM para conocer su estado: READY, SIM PIN, SIM PUK

    Public Sub PIN_Control()

    Dim frmMAIN As New MainProgram

    Dim frmPIN As New PIN_Code

    strSend = "AT+CPIN?" + vbCr ' Preparamos la trama

    SendCommand() ' Enviamos comando

    InicTimerOut() ' 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" + vbCrLf

    MsgBox("Sistema preparado", vbOKOnly + vbInformation) ' Mensaje de control

    strReceived = "" ' Vaciamos el contenido (lectura del buffer)

    frmMAIN.Show() ' Mostramos la Ventana Principal

    aux = 1

    ' Tratamiento de la respuesta: NECESARIO CODIGO PIN

    Case strSend + vbCrLf + "+CPIN: " + "SIM PIN" + vbCrLf + vbCrLf + "OK" + vbCrLf

    MsgBox("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 ventana

    frmPIN.Show() ' Mostramos el formulario de introducci¢n del PIN

    aux = 1

    ' Tratamiento de la respuesta: NECESARIO CODIGO PUK

    Case strSend + vbCrLf + "+CPIN: " + "SIM PUK" + vbCrLf + vbCrLf + "OK" + vbCrLf

    MsgBox("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 PIN

    aux = 1

    ' Tratamiento de la respuesta: SIM NO INSERTADO

    Case strSend + vbCrLf + "+CME ERROR: SIM not inserted" + vbCrLf

    MsgBox("Introduzca la tarjeta SIM y pulse Aceptar", vbOKOnly + vbExclamation)

    strReceived = "" ' Vaciamos el contenido (lectura del buffer)

    frmMAIN.Hide() ' Impedimos la actuaci¢n sobre la ventana

    aux = 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 Module

     

     

    Module TreatResponse

    ' MàDULO DE DECLARACIàN DE TRATAMIENTO DE LAS RESPUESTAS

    '*********************************************************************************

     

    ' En este m¢dulo reflejamos el tratamiento a las diferentes respuestas

    ' para cada una de las tramas implementas que siguen el formato de

    ' respuesta "AT..." + par metros + Cr + CrLf + mensaje + CrLf

    '*********************************************************************************

     

    ' TRATAMIENTO DE LA RESPUESTA AT+CMEE

    ' Comprobamos que la trama llego correctamente y el nuevo par metro ha

    ' quedado configurado

    Public Sub MobileEquipmentError()

    Select Case ResultCode()

    Case "OK" '+ vbCrLf

    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 Select

    strReceived = ""

    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 Select

    strReceived = ""

    End Sub

    '*********************************************************************************

     

    ' FUNCIàN QUE DEVUELVE EL TEXTO QUE NOS INTERESA DISCRIMINAR DE TODA LA RESPUESTA

    ' OBTENIDA

    ' Lee a partir de la trama enviada + CrLf hasta que encuentra los car cteres finales

    ' CrLf. De este modo retorna el mensaje OK, ERROR, CONNECT, BUSY, etc

    Public Function ResultCode()

    ' Declaraci¢n de variables

    Dim Str2 As String = ""

    Dim Str3 As String = ""

    Dim straux1 As String = ""

    Dim straux2 As String = ""

    Str2 = vbCr + vbCrLf

    Str3 = vbCrLf

    ' Proceso de discriminaci¢n del mensaje

    straux1 = Mid(strReceived, InStr(strReceived, Str2) + 3)

    straux2 = Mid(strReceived, InStr(strReceived, Str2) + 3, InStr(straux1, Str3) + (-1))

    ResultCode = straux2 ' Devuelve el mensaje

    End Function

    End Module
    martes, 3 de abril de 2007 11:02
  • 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 MainProgram

    TimeOutCount = 0 ' Reiniciamos variable de control

    frmMAIN.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!

    martes, 3 de abril de 2007 13:28
  • He entendido bien el problema, pero no tengo muy clara la solución. Puedes darme un ejemplo, por favor.

     

    Gracias y un saludo

    miércoles, 4 de abril de 2007 8:20
  • 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?

    miércoles, 4 de abril de 2007 8:26
  • Hecho!!. Ahora me ha abierto el formulario del código PIN una vez y al darle a aceptar genera una excepción. Si vuelvo a ejecutar el programa ya no funciona. ¿podría existir algún fallo en la configuración del Visual 2005?
    miércoles, 4 de abril de 2007 10:14
  • Yo de momento creo que no se trata de un problema con el VS2005.

     

    ¿Puedes postearnos algo más de información sobre la excepción?

    miércoles, 4 de abril de 2007 10:22
  • Decía: Excepción no controlada. El Puerto está cerrado. Aceptar para continuar o Salir para finalizar. Lo extraño es que justo antes de la excepción he enviado un comando al puerto y me ha respondido "OK".
    miércoles, 4 de abril de 2007 10:48
  • 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í.

     

     

    miércoles, 4 de abril de 2007 10:54
  • 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 System

    Imports System.IO.Ports

     

    Public 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

    '*********************************************************************************

     

    Private Sub MainProgram_Load(ByVal sender As System.Object, ByVal _

    e As System.EventArgs) Handles MyBase.Load

    With RS232

    .PortName = "COM1"

    .BaudRate = 9600

    .Parity = Parity.None

    .DataBits = 8

    .StopBits = StopBits.One

    End With

    RS232.ReadTimeout = 500

    RS232.WriteTimeout = 500

    ConexionEstablecer.Enabled = True

    ConexionCortar.Enabled = False

    End Sub

    '*********************************************************************************

     

    Private Sub ConexionEstablecer_Click(ByVal sender As System.Object, ByVal e _

    As System.EventArgs) Handles ConexionEstablecer.Click

    ConexionEstablecer.Enabled = False

    ConexionCortar.Enabled = True

    Try

    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 Try

    End Sub

    '*********************************************************************************

     

    Private Sub ConexionCortar_Click(ByVal sender As System.Object, ByVal e _

    As System.EventArgs) Handles ConexionCortar.Click

    RS232.Close()

    Timer1.Stop()

    txtRX.AppendText(RS232.PortName & " cerrado a las " & Now.ToString & vbCrLf)

    ConexionEstablecer.Enabled = True ' Recurso accionable

    ConexionCortar.Enabled = False ' Recurso no accionable

    End Sub

    '*********************************************************************************

     

    Private Sub ConexionSalir_Click(ByVal sender As System.Object, ByVal e _

    As System.EventArgs) Handles ConexionSalir.Click

    If RS232.IsOpen Then

    RS232.Close()

    End If

    Me.Dispose()

    End Sub

    '*********************************************************************************

     

    Public Sub RS232_DataReceived(ByVal sender As Object, ByVal e _

    As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived

    strData = 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 bttSend_Click(ByVal sender As System.Object, ByVal e _

    As System.EventArgs) Handles bttSend.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

    PIN_Control() ' Envio AT+CPIN? + Tratamiento de la respuesta

    End Sub

    '*********************************************************************************

     

    ' INCIALIZAMOS EL TIMER1 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 If

    End Sub

    '*********************************************************************************

     

    '*********************************************************************************

    ' ESTO ESTABA EN EL MÓDULO DE DECLARACIÓN DE LOS PROCEDIMIENTOS

    '*********************************************************************************

    ' Acción general de trama. Envia comando, espera respuesta y trata TimeOut

    ' Común para todos aquellos comandos cuyo formato de respuesta es tipo A

    ' AT... + <parámetros> + Cr + CrLf + mensaje + CrLf

     

    Public Sub ManagementRaster()

    SendCommand()

    InicTimerOut()

    WaitResultCode()

    Time_Out()

    End Sub

    '*********************************************************************************

     

    ' Envio del comando AT

    Public Sub SendCommand()

    aux = 0 ' Variable de control de respuesta completa

    RS232.WriteLine(strSend) ' Introduce en el buffer el comando AT

    End Sub

    '*********************************************************************************

     

    ' Inicialización del Timer para el control del TimeOut

    Public Sub InicTimerOut()

    TimeOutCount = 0 ' Reiniciamos variable de control

    Timer1.Start() ' Activamos el Timer

    End Sub

    '*********************************************************************************

     

    ' Bucle de espera para la respuesta

    Public Sub WaitResultCode()

    Do

    Loop Until (InStr(Len(strSend) + 2, strReceived, vbCrLf) Or TimeOut)

    End Sub

    '*********************************************************************************

     

    ' Comprobamos si ha existido un tiempo excesivamente grande para responder.

    ' Si ha ocurrido TimeOut se trata, sino se deshabilita el timer y se reinician los

    ' contadores para el próximo envío de comandos

    Public Sub Time_Out()

    If TimeOut Then

    MsgBox("Error de Timeout. Compruebe el modem", +vbOKOnly + vbCritical)

    End ' Finalizamos el programa. Ocurrió error en el modem

    Else

    Timer1.Stop()

    TimeOutCount = 0

    TimeOut = False

    End If

    End Sub

    '*********************************************************************************

     

    ' Acción que realiza el control de los códigos de acceso

    ' Interroga a la tarjeta SIM para conocer su estado: READY, SIM PIN, SIM PUK

    Public Sub PIN_Control()

    Dim frmPIN As New PIN_Code

    strSend = "AT+CPIN?" + vbCr ' Preparamos la trama

    SendCommand() ' Enviamos comando

    InicTimerOut() ' 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" + vbCrLf

    MsgBox("Sistema preparado", vbOKOnly + vbInformation) ' Mensaje de control

    strReceived = "" ' Vaciamos el contenido (lectura del buffer)

    Me.Show() ' Mostramos la Ventana Principal

    aux = 1

    ' Tratamiento de la respuesta: NECESARIO CODIGO PIN

    Case strSend + vbCrLf + "+CPIN: " + "SIM PIN" + vbCrLf + vbCrLf + "OK" + vbCrLf

    MsgBox("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 ventana

    frmPIN.Show() ' Mostramos el formulario de introducción del PIN

    aux = 1

    ' Tratamiento de la respuesta: NECESARIO CODIGO PUK

    Case strSend + vbCrLf + "+CPIN: " + "SIM PUK" + vbCrLf + vbCrLf + "OK" + vbCrLf

    MsgBox("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 PIN

    aux = 1

    ' Tratamiento de la respuesta: SIM NO INSERTADO

    Case strSend + vbCrLf + "+CME ERROR: SIM not inserted" + vbCrLf

    MsgBox("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 ventana

    aux = 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

    miércoles, 4 de abril de 2007 11:06
  • 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!!!

    miércoles, 4 de abril de 2007 12:24
  • 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" + vbCrLf

    MsgBox("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 = 1

     

    Al 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.Load

    txtPIN.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) Then

    KeyAscii = 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 blanco

    MsgBox("Introduzca el c¢digo PIN en la caja de texto")

    Exit Sub ' Salimos de la rutina

    End If

    PIN = Chr(34) + txtPIN.Text + Chr(34) ' C¢digo PIN entre comillas

    strSend = "AT+CPIN=" + PIN + vbCr

    frmMAIN.ManagementRaster() ' Enviamos la trama

    TreatPIN_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 programa

    frmMAIN.Enabled = True

    End Sub

    '*********************************************************************************

    End Class

     

    miércoles, 4 de abril de 2007 13:36
  •  Kramer Escribió:

    strReceived = "" ' Vaciamos el contenido (lectura del buffer)

    frmPIN.Show() ' Mostramos el formulario de introducción del PIN

    aux = 1

     

    Perdona 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()

     

     

    miércoles, 4 de abril de 2007 13:47
  • 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

    jueves, 5 de abril de 2007 9:16
  • Hola:

    Puedes descargar el manual en pdf sobre VB y  puerto serie.

    Saludo.

    http://electronica-pic.blogspot.com
    martes, 26 de mayo de 2009 8:45