Puerto serial en visual basic

Un saludo a todos...
Estoy usando la funcion que comento Gradmaster hace tiempo Asc(variable) para convertir el dato de entrada ene l puerto serie (que vieene en un formato Ascii) y lo quiero hacer pasar or una comparacion.
Estoy mandando desde el pic una letra A y una letra B, asignadas a dos push buttons, las cuales pude ver correctamente en Hyperterminal. El problema esta en Visual Basic, ya que utilizo la funcion Asc para determinar que valor es el que estoy recibiendo y en base a eso realizar una accion pero resulta que no me detecta el valor correcto en decimal de la letra A o B recibidas, por lo que no se realiza ninguna accion, haber si alguien me orienta sobre que hago mal este es mi codigo...

Private Sub puerto_OnComm()
If puerto.CommEvent = comEvReceive Then
txtin = puerto.Input
equis = Asc("txtin")
If equis = 41 Then
lblroja.Caption = numero1 + 1
numero1 = Val(lblroja)
Else
If equis = 42 Then
lblazul.Caption = numero2 + 1
numero2 = Val(lblazul)
End If
End If
End If
End Sub
 
Mostra txtin a ver que llega y postea. Que es numero1? y numero2? no entiendo que queres hacer. Para que le sumas 1? Donde definis numero1 y 2? lo mostras y luego lo asignas? deberia ser al reves..
 
gracias por su respuesta elbrujo
Ah olvide mencionar lo de numero1 y numero2 solo son variables destinadas aincrementarse, este programa intenta realizar un contador de votos lblrojo y lblazul son las dos cuentas.
Ya intente mostrar el valor de txtin pero no me muestra nada, tambien mostre el valor de la variable equis y me da 116 independientemente del dato que llegue, eso si se me hace rarisimo, te posteo el codigoc ompleto acontinuacion Olvide mencionar que desde el PIC estoy mandando una letra A y una letra B, las cuales corresponden a dos botones, boton A y boton B, dependiendo de que boton se presione se debe incrementar una cuenta

Dim txtin, txtout As String
Dim numero1, numero2, equis As Integer
Dim equis As Integer

Private Sub cmdenc_Click()
If cmdenc.Caption = "Inicializar" Then
puerto.CommPort = Val(10)
puerto.PortOpen = True
Sistema.Visible = True
cmdenc.Caption = "Desconectar"
Else
If cmdenc.Caption = "Desconectar" Then
Sistema.Visible = False
puerto.PortOpen = False
cmdenc.Caption = "Inicializar"
End If
End If
End Sub

Private Sub cmdsalir_Click()
End
End Sub

Private Sub puerto_OnComm()
If puerto.CommEvent = comEvReceive Then
txtin = puerto.Input
equis = Asc("txtin")
cmdcaliz.Caption = equis
Select Case equis
Case 41
lblroja.Caption = numero1 + 1
numero1 = Val(lblroja)
Case 42
lblazul.Caption = numero2 + 1
numero2 = Val(lblazul)
End Select
End If
End Sub
 
Última edición:
Decis que por hyperterminal recibis los caracteres? Que puerto usas? y en BV usas el puerto com10? sino te muestra nada es que no recibe nada. proba en el mismo puerto..
 
Si uso el mismo puerto, de hecho con otro programa que copie de un tutorial en youtube recibo el dato en ascii sin problemas por ejemplo, mandaba un 31 del pic y recibia un numero 1 en visual basic, ese no es mi problema y si estoy utilizando el puerto 10

El problema es el manejo de los datos una vez que me llegan al buffer de entrada, es decir no puedo manipularlos de manera de detectar que caracter me esta llegando, pero ese es problema de software.
Se que el dato me llega en formato ASCII es decir se debe tratar como un String cierto ? okay entonces por ejemplo si me llega una "A" y esa A la paso a txtin
txtin = puerto.Input <-- puerto es el nombre de mi elemento de control de puertos
y txtin lo paso a un integer asi
equis = Asc("txtin")
entonces equis deberia ser igual a 41 cierto ?
Pero si desplego en un label el valor de equis me da 116 independientemente de que me llegue una A o una B,
O si se te ocurre alguna otra manera de detectar que dato es el que me ha llegado es bienvenida... tal vez me este complicando yo solo.
 
equis = Asc("txtin") ? deberia ser equis = Asc(txtin) porque sino toma el string como palabra "txtin" y no como variable. Por otro lado hasta que muestres txin y llegue algun dato ni te preocupes de como sigue el programa.

En admin de hardware cuando vas a puerto serie el com10 existe? me llama la atencion que el hyperterminal lo tengas configurado en com10.. que IRQ estas usando? porque no usas los valores reales? com1 o com2? 3f8 o 2f8? en el bios esas son las direcciones reales...
 
Vaaaa... error de alguien que no sabe mucho de visual... correji eso de Asc(txtin) y todo funciono de maravilla ya cada boton incrementa su correspondiente cuenta.. si si fue un error babotas de mi parte jaaa
Muchisimas gracias por tu tiempo elbrujo... (Y)
 
Bien ahi! bueno me alegro.. y eso que hace muchos años que no leeo VB. Para la proxima tene siempre en cuenta que cuando te trabes en un punto de un codigo, vuelvas hacia atras comprobando valores hasta el punto que se cortan asi es mas facil encontrar el problema.. hay un modo debug que te va mostrando el contenido de las variables.
 
Última edición:
Hola amigos, veo que tienen conocimientos bastante avanzados en todo lo que es la comunicacion serial entre PIC's y PC's... Hace unos dias que estoy queriendo iniciarme en este tema y he logrado que el pic me envie los datos a la pc y los he recibido sin problemas. Pero cuando quiero enviarle los datos de la PC al PIC no logro ninguna respuesta...
Estoy utilizando en Visual Basic 6.0 la funcion MSComm y el envio por puerto serie lo hago con siguientes instrucciones:

Private Sub cmdEnviar_Click()
Dim pepe As Variant
If comm1.PortOpen Then
comm1.Output = Trim(Asc(txtEnviar.Text))
Else
Form1.Caption = "Se debe abrir el puerto"
End If
txtEnviar.SetFocus
End Sub

y en el pic tengo el siguiente programa

RX_DATO BCF TXSTA,TXEN ;
BCF PIR1,RCIF ; Sí: restaura flag de recepción.
MOVFW RCREG ; Lee el dato recibido.
MOVWF RECEPCION ; GUARDA EL BYTE RECIBIDO EN RECEPCION
MOVWF AUXILIAR ;
CALL LINEA_2 ; pocisiona la linea 2 de un lcd
MOVFW RECEPCION ;
MOVWF PORTD ;
MOVLW 'G' ; HEXA DE LA LETRA G
SUBWF AUXILIAR ;
BTFSC STATUS,2 ; ¿VOLVER A MANDAR EL DATO?
GOTO VUELVE ;
MOVFW RECEPCION ;
MOVWF AUXILIAR ;
MOVLW 'B' ; HEXA DE LA LETRA B
SUBWF AUXILIAR ;
BTFSC STATUS,2 ; ¿clave correcta?
RETURN ; NO, RETORNA
GOTO RX_DATO ;

VUELVE MOVFW CUENTA ; SI, VUELVE A MANDARLO
CALL TX_DATO ;
GOTO RX_DATO ;

la idea es que si recibo el ascii de G vuelva a enviar el ultimo dato y si resibo B salga de la recepcion... y no ni la B ni la G... si necesitan el codigo completo avisen que lo pongo pero me parece que hay algun error en estas lineas que coloque pero no puedo descubrir donde... En el PIC la configuracion para la TX y la RX es la que se encuentra en abundancia en el foro y coincide exactamente ya que me canse de controlarlo...

Espero que me puedan ayudar... Saludos
 
Saludos Facundo_Bellesi....
Hasta donde recuerdo de asm (solo programe el 628 y el 877 en asm) la instruccion MOVFW no existe, creo que lo que intentas hacer es leer el registro, intenta con MOVF y postea que paso. Tambien, por lo general las banderas de cualquier interrupcion por claridad siempre se borran hasta el final de la subrutina de interrupcion, aunque no creo que sea relevante eso en este caso...

De hecho segun el datasheet del 628
"Flag bit RCIF is a read only bit which is
cleared by the hardware. It is cleared when the RCREG
register has been read and is empty."

Por lo que no tienes que borrar la bandera...
 
Última edición:
Hola 20doctubre,

La instrucción MOVFW e lo mismo que colocar MOVF f,d; el MPLAB te lo toma indistintamente a cualquiera de las dos instrucciones. Y en cuanto a borrar el flag, como no estoy trabajando con interrupciones no me influye, lo borro por costumbre nada mas. Igualmente por las dudas probé estas modificaciones que me propusiste y sigue sin responder... :confused:

Gracias por tu respuesta... Saludos
 
Pero si no estas utilizando interrupcion como llegas a la subrutina RX_DATO ? tuvieras que hacer algun tipo de poleo al bit RCIF, o como lo haces tu ?

oye Facundo_Bellesi, otra cosa que me parece rara es que apagas el transmisor para recibir el dato, lo cual esta bien, pero no lo vuelves a encender, que pasa ahi ?

Saludos...
 
Última edición:
Ya logre que reciba!!!!!!!!!

Tenia unos pines cambiados en la placa... :oops:

La programación andaba bien... Para entrar a RX_DATO fuerzo esa subrutina cuando necesito que me responda la PC y cuando la bandera me avisa que estoy por recibir...

En cuanto a la transmision, como yo fuerzo la entrada, tambien se cuando va a volver entonces al regreso de RX_DATO habilito otra vez la transmision...

Ahora estoy tratando de utilizar las interrupciones por recepcion. La idea es que si recibo en el PIC el ASCCI de F haga una subrutina, pero resulta que entra a la recepcion y va a la subrutina por mas que no le envie ningun dato. A continuacion muestro la programacion...

INTERRUP BTFSS PIR1,RCIF ;
GOTO VOLVER ;
MOVFW RCREG ; Lee el dato recibido.
MOVWF RECEPCION ; GUARDA EL BYTE RECIBIDO EN RECEPCION
MOVWF AUXILIAR ;
VOLVER CLRF RCREG ; Limpia el registro de recepción
BCF PIR1,RCIF ;
BCF INTCON,1 ; BORRA LA BANDERA DE INTERRUP
RETFIE ;
;*************************************************
REPE MOVLW 'F' ;
SUBWF AUXILIAR ;
BTFSC STATUS,2 ;
CALL TRABA_P ;
;************************************************
TRABA_P CLRF AUXILIAR ;
CLRF RECEPCION ;
CLRF RCREG ;
BTFSC BANDERA,1 ; PUERTA CERRADA?
GOTO DESTRABA ; SI, VA A ABRIRLA
BSF PORTC,1 ; CIERRA LA PUERTA
CALL LIMPIA_LCD ;
CALL LINEA_1 ;
CALL MENSAJE_7 ; " PUERTA CERRADA "
BSF BANDERA,1 ;
RETURN ;
DESTRABA BCF PORTC,1 ; ABRE LA PUERTA
BCF BANDERA,1 ;
CALL LIMPIA_LCD ;
CALL LINEA_1 ;
CALL MENSAJE_8 ; " PUERTA ABIERTA "
RETURN ;
;***********************************************

La verdad no entiendo por que pasa eso... Espero puedan ayudarme...

Algo que se me ocurre preguntar, aunque creo muy poco probable... El MAX232n tiene algun tipo de memoria interna que retenga la ultima recepcion o algo asi... Porque es lo unico que se me ocurre y aunque revise y en la hoja de datos no me dice nada, creo que ya estoy buscando algun tipo de conclucion salvadora... :cry:
 
Última edición:
Según el google la pregunta fué respondida en esta página pero no la encontre.
Mi problema es el siguiente:
Utilizo el VB 2008 y el registro Mscomm no aparece como en la versión del 2005. cambió de nombre? había que configurarlo antes utilizarlo? no me refiero a la configuración del puerto como la velocidad y demás parámetros sinó que al utilizarlo me da el error de "No se ah declarado el nombre de Mscomm1"

Gracias de antemano
Mauricio
 
Según el google la pregunta fué respondida en esta página pero no la encontre.
Mi problema es el siguiente:
Utilizo el VB 2008 y el registro Mscomm no aparece como en la versión del 2005. cambió de nombre? había que configurarlo antes utilizarlo? no me refiero a la configuración del puerto como la velocidad y demás parámetros sinó que al utilizarlo me da el error de "No se ah declarado el nombre de Mscomm1"

Gracias de antemano
Mauricio

Ahí va un manual...
Usando el SerialPort con Visual Basic 2008

Supongo que estas acostumbrado al VB6 que al .NET, ps hay una enorme diferencia (a buenas o malas te acostumbras de prescindir de las libs del Framework).

Saludos
 
Atrás
Arriba