Puerto serial en visual basic

Bueno en Visual es mucho mas sencillo que en C# por que VB hablando de la version 6.0 por que en la net no encuentro el control, utilizas el control MSCom, cuando habras tu proyecto preciona las teclas Ctrl + T y te abrira una ventana en donde podras encontrar mucho controles extra a los que te muestra la barra de herramientas.

busca el MsComm y selecionalo, despues aparecera en la barra de herramientas, lo insertas como so fuece un boton o X control; las propiedades que usaras son la siguientes.

mscomm1.portopen=true 'si es que usas el puerto serial 1, el indicar true quiere decir que abrira el puerto cuando se ejecute la instruccion.

var1=mscomm1.input ' la variable var1 tendra el valor en ascii de la entrada que por cierto y para mala suerte solo se pueden usar 8 bits.

puedes usar un textbox para ver el caracter ascci del valor que mandes con el pic.

para pasarlo a un valor decimal de 0 a 255 usas el comoando Asc (var1) que comvertira el valor de la variable de entrada en un valor decimal.

si lo quieres hexadecimal usas hex$(var1)

el siguiente comando que usaras es MSComm1.output= var2, con este comando le das salida al numero que tengas guardado en la variable dos, si es un numero y la variable no esta declarada como integer tomara el valor ascii del numero o caracter que introduzcas en la variable 2, y si esta declarada como integer te tomara el valor numerico.

la ultima para cerrar el puerto es: MSComm1.portopen=false tienes que cerrar el puerto cada vez que terminas de usarlo por que sino te ocacionara problemas cuando quieras abrirlo nuevamente, por que no puedes abrir un puerto que ya esta abierto

espero te sirva de algo esta pequeña referencia, exito.





Hola, tengo un problema. Cuando yo pongo asc(dato) (previamente hice dato=mscomm1.input), siendo dato una variable del tipo variant el visual basic me tira error 5.
Me podrias explicar por que hace eso?
Saludos.
Chau.
 
Porque no es el tipo correcto...
ASC (funcion)

Devuelve un tipoInteger que representa elcódigo de carácter correspondiente a la primera letra de una cadena.

Sintaxis

Asc(cadena)

Elargumento obligatorio cadena es unaexpresión de cadena válida. Si cadena no contiene caracteres, se produce unerror en tiempo de ejecución.

Comentarios

El intervalo del valor de retorno es entre 0 y 255 en sistemas que no sean DBCS, y entre –32768 y 32767 en sistemasDBCS.

Nota La función AscB se utiliza con bytes de datos contenidos en una cadena. En lugar de devolver el código de carácter para el primer carácter, AscB devuelve el primer byte. La función AscW siempre devuelve el código de carácterUnicode en plataformas donde no se admite Unicode, en cuyo caso, el comportamiento es idéntico al de la función Asc.

definela como string...
 
Lubeck, resulta que ahora defino la variable como string y al hacer Asc(variable) me tira error 5.
Yo basicamente lo que necesito es graficar en un picture box lo que leo del puerto serie de la pc. Desde un microcontrolador mando a la pc datos provenientes de varios sensores. El microcontrolador recibe los datos de los sensores, los digitaliza y manda de a uno los datos hacia la pc. Luego en la pc con el visual basic lo que tengo que hacer es graficar en un picture los datos que llegan.
No se si me explico.
Por favor si me puedes dar una mano te agradeceria.
Por favor perdona que te moleste.
Saludos.
Chau.
 
Puedes subir la rutina... para ver si encuentro algun error..
no hay otra mas que definir la variable tipo string a lo mejor no la defines en el lugar correcto...
 
Dim YE As String

Esto es parte del evento load del form:

MSComm1.CommPort = 1
'Determina: 9600-Velocidad en Baudios, N-No utiliza ninguna paridad,
'8-Cantidad de bits de envio y recepcion por paquete,
'1-Determina los bits de parada
MSComm1.Settings = "9600,N,8,1"
'No existe control de flujo
MSComm1.Handshaking = comNone
'Lee todo el buffer de entrada para que quede vacio
MSComm1.InputLen = 0
'Cada vez que se recibe un caracter se producira el evento onComm
MSComm1.RThreshold = 1

Este es el evento oncomm:

Private Sub MSComm1_OnComm()

Dim valor As String
'recoge el valor de entrada
If MSComm1.CommEvent = comEvReceive Then
YE = MSComm1.Input
YE = Asc(YE)
cuadro.PSet (EQUIS, -3 * YE + cuadro.Height / 2), vbRed
Label2.Caption = YE & " Grados Celsius"
t = t + 1
Print #1, t & " minutos"
Print #1, YE & " grados Celsius"
'recoge el valor de entrada
YE = MSComm1.Input
YE = Asc(YE)
cuadro2.PSet (EQUIS, -3 * YE + cuadro2.Height / 2), vbGreen
Print #1, YE & " hecto pascales"
Label6.Caption = YE & " Hecto pascales"
EQUIS = EQUIS + 1
End If
If EQUIS > cuadro.Width Then
cuadro.Cls
cuadro2.Cls
EQUIS = 0
Call rejilla
End If

Perdon, una aclaracion: leo dos veces el puerto por que tengo dos sensores conectados al microcontrolador y este (el microcontrolador) multiplexa los canales del conversor adc y envia byte por byte esos datos a la pc.
 
Última edición:
HAber lo primero que veo...

Código:
Dim valor As String, [B]YE as Integer[/B]
'recoge el valor de entrada
If MSComm1.CommEvent = comEvReceive Then
[B]Valor[/B] = MSComm1.Input
YE = Asc([B]Valo[/B]r)
cuadro.PSet (EQUIS, -3 * YE + cuadro.Height / 2), vbRed
Label2.Caption = YE & " Grados Celsius"
t = t + 1
Print #1, t & " minutos"
Print #1, YE & " grados Celsius"
'recoge el valor de entrada
[B]Valor [/B]= MSComm1.Input
YE = Asc([B]Valor[/B])
cuadro2.PSet (EQUIS, -3 * YE + cuadro2.Height / 2), vbGreen
Print #1, YE & " hecto pascales"
Label6.Caption = YE & " Hecto pascales"
EQUIS = EQUIS + 1
End If
If EQUIS > cuadro.Width Then
cuadro.Cls
cuadro2.Cls
EQUIS = 0
Call rejilla
End If

Lo mas problable es que no funcione porque defines dos msccom1.input pero ya no te va a tirar el error...
pruebalo...
 
Última edición:
Me lo suponia esta tratando de convertir en el segundo input un Null o sea YE=Asc("") donde "" es null
estas mal en eso el evento mscomm.event se ejecuta al recibir el puerto y con el input vacia el buffer... lo que tengas que hacer lo tienes que hacer con un solo msccom.input...
me explico???
 
Hola, se me ocurrio una forma de hacer lo que quiero usando solo una vez el mscomm1.input. El codigo es el siguiente pero resulta que me grafica en los dos pictures al mismo tiempo.

Private Sub MSComm1_OnComm()

Dim valor As String, YE As Integer
If MSComm1.CommEvent = comEvReceive Then
'recoge el valor de entrada
valor = MSComm1.Input
YE = Asc(valor)
etiqueta.Caption = contador

Select Case contador

Case 0
cuadro.PSet (EQUIS, -3 * YE + cuadro.Height / 2), vbRed
Label2.Caption = YE & " Grados Celsius"
t = t + 1
Print #1, t & " minutos"
Print #1, YE & " grados Celsius"

Case 1
cuadro2.PSet (EQUIS, -3 * YE + cuadro2.Height / 2), vbGreen
t = t + 1
Print #1, t & " minutos"
Print #1, YE & " hecto pascales"
Label6.Caption = YE & " Hecto pascales"

End Select

contador = contador + 1
If contador = 2 Then
contador = 0
End If
EQUIS = EQUIS + 1
End If
If EQUIS > cuadro.Width Then
cuadro.Cls
cuadro2.Cls
EQUIS = 0
Call rejilla
End If


End Sub
 
Lo que estoy haciendo es una aplicacion cliente servidor. Yo tengo un microcontrolador que sensa datos, los manda a la pc por puerto serie y despues los manda a un servidor.
Cuando pruebo ambos (cliente y servidor) en mi maquina, anda bien, pero cuando pruebo el servidor en otra maquina, no recibe los datos que envia el cliente.
Te adjunto los dos codigos:

Cliente:

Option Explicit
Dim Cadena As String
Dim t As Double
Public contador As Integer, variable As Boolean, Fecha As String, Hora As String, puertos As String
Public Temperatura As Double, Presion As Double, Humedad As Double
Public Ti As Integer, Pi As Integer, Hi As Integer
Const MAX = 15

Private Sub cargar_Click()

ete:
dialogo.Filter = "txt|*.txt"
dialogo.DialogTitle = "Cargar un archivo"
dialogo.ShowOpen
If dialogo.FileName = "" Then Exit Sub
Cadena = dialogo.FileName
Open Cadena For Output As #1
On Error GoTo ete
cargar.Enabled = False
'Abre el puerto seleccionado
MSComm1.PortOpen = True

End Sub

Private Sub cliente_Close()

Label1.Caption = "Sin conexión"

End Sub

Private Sub cliente_Connect()

Label1.Caption = "Conectado"

End Sub

Private Sub cliente_ConnectionRequest(ByVal requestID As Long)

cliente.Close
cliente.Accept requestID

End Sub

Private Sub Command1_Click()

If Combo1.Text <> "" And (Asc(Combo1.Text) > 47 And Asc(Combo1.Text) < 58) Then
MSComm1.CommPort = Int(Combo1.Text)
Combo1.Enabled = False
Command1.Enabled = False
cargar.Enabled = True
End If

End Sub

Private Sub Command2_Click()

cliente.Protocol = sckTCPProtocol
cliente.RemoteHost = Text1.Text
cliente.LocalPort = 0
cliente.RemotePort = 7381
cliente.Connect
Text1.Enabled = False
Command2.Enabled = False

End Sub

Private Sub Form_Load()

cargar.Enabled = False
'Determina: 9600-Velocidad en Baudios, N-No utiliza ninguna paridad,
'8-Cantidad de bits de envio y recepcion por paquete,
'1-Determina los bits de parada
MSComm1.Settings = "9600,N,8,1"
'No existe control de flujo
MSComm1.Handshaking = comNone
'Lee todo el buffer de entrada para que quede vacio
MSComm1.InputLen = 0
'Cada vez que se recibe un caracter se producira el evento onComm
MSComm1.RThreshold = 1
t = 0
contador = 10
variable = False
Temperatura = 0
Presion = 0
Humedad = 0
Ti = 0
Pi = 0
Hi = 0
'Nombre de los ejej X e Y
GR.Axes(1).Caption = " Tiempo[seg]"
GR2.Axes(1).Caption = " Tiempo[seg]"
GR3.Axes(1).Caption = " Tiempo[seg]"
GR.Axes(2).Caption = " Temperatura[ºC]"
GR2.Axes(2).Caption = " Presión[Hp]"
GR3.Axes(2).Caption = " Humedad[%]"
'Color de las graficas. Por defecto GR2 es verde
GR.Plots(1).LineColor = vbRed
GR3.Plots(1).LineColor = vbBlue
'Escala del eje Y
GR.Axes(2).AutoScale = False
GR.Axes(2).Minimum = 0
GR.Axes(2).Maximum = 255
GR2.Axes(2).AutoScale = False
GR2.Axes(2).Minimum = 0
GR2.Axes(2).Maximum = 255
GR3.Axes(2).AutoScale = False
GR3.Axes(2).Minimum = 0
GR3.Axes(2).Maximum = 2.55
With Combo1
.AddItem 1
.AddItem 2
.AddItem 3
.AddItem 4
.AddItem 5
.AddItem 6
.AddItem 7
.AddItem 8
.AddItem 9
.AddItem 10
End With

End Sub

Private Sub Form_Unload(Cancel As Integer)

If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
Close #1
cliente.Close

End Sub

Private Sub MSComm1_OnComm()

Dim valor As String, YE As Integer
If MSComm1.CommEvent = comEvReceive Then
valor = MSComm1.Input
Select Case Left(valor, 1)
Case "T"
contador = 0
If cliente.State = 7 Then
cliente.SendData Left(valor, 1)
Else: Label1.Caption = "Sin conexión"
End If
Case "P"
contador = 1
If cliente.State = 7 Then
cliente.SendData Left(valor, 1)
Else: Label1.Caption = "Sin conexión"
End If
Case "H"
contador = 2
If cliente.State = 7 Then
cliente.SendData Left(valor, 1)
Else: Label1.Caption = "Sin conexión"
End If
End Select
If contador = 0 And Left(valor, 1) <> "T" And Left(valor, 1) <> "P" And Left(valor, 1) <> "H" Then
YE = Asc(Right(valor, 1))
Temperatura = Temperatura + YE
Ti = Ti + 1
If Ti = MAX Then
Temperatura = Temperatura / Ti
'Trunco a dos decimales
Temperatura = FormatNumber(Temperatura, 2)
GR.ChartXvsY t, Temperatura
Ti = 0
Label2.Caption = Temperatura & " Grados Celsius"
t = t + 1
Print #1, Temperatura & " grados Celsius"
If cliente.State = 7 Then
cliente.SendData Str(Temperatura)
Else: Label1.Caption = "Sin conexión"
End If
Temperatura = 0
End If
End If
If contador = 1 And Left(valor, 1) <> "T" And Left(valor, 1) <> "P" And Left(valor, 1) <> "H" Then
YE = Asc(Right(valor, 1))
Presion = Presion + YE
Pi = Pi + 1
If Pi = MAX Then
Presion = Presion / Pi
'Trunco a dos decimales
Presion = FormatNumber(Presion, 2)
GR2.ChartXvsY t, Presion
Pi = 0
Label6.Caption = Presion & " Hecto pascales"
t = t + 1
Print #1, Presion & " hecto pascales"
If cliente.State = 7 Then
cliente.SendData Str(Presion)
Else: Label1.Caption = "Sin conexión"
End If
Presion = 0
End If
End If
If contador = 2 And Left(valor, 1) <> "T" And Left(valor, 1) <> "P" And Left(valor, 1) <> "H" Then
YE = Asc(Right(valor, 1))
Humedad = Humedad + YE
Hi = Hi + 1
If Hi = MAX Then
Humedad = Humedad / Hi
Humedad = Humedad / 100
'Trunco a dos decimales
Humedad = FormatNumber(Humedad, 2)
GR3.ChartXvsY t, Humedad
Hi = 0
Label8.Caption = Humedad & " %"
t = t + 1
variable = True
Print #1, Humedad / 100 & " %"
If cliente.State = 7 Then
cliente.SendData Str(Humedad)
Else: Label1.Caption = "Sin conexión"
End If
Humedad = 0
End If
End If
If variable = True Then
Fecha = Date$
Hora = Time$
Print #1, Fecha
Print #1, Hora
variable = False
End If
End If

End Sub

Private Sub acercade_Click()

AD.Show vbModal

End Sub


Programa Servidor:

Public Variable As String, tiempo As Integer, contador As Integer
Public Temperatura As String, Presion As String, Humedad As String
Public llave As Boolean
Const Lim = 75

Private Sub acercade_Click()

AD.Show vbModal

End Sub

Private Sub Form_Load()

GR.Axes(1).Caption = " Tiempo[seg]"
GR2.Axes(1).Caption = " Tiempo[seg]"
GR3.Axes(1).Caption = " Tiempo[seg]"
GR.Axes(2).Caption = " Temperatura[ºC]"
GR2.Axes(2).Caption = " Presión[Hp]"
GR3.Axes(2).Caption = " Humedad[%]"
GR.Plots(1).LineColor = vbRed
GR3.Plots(1).LineColor = vbBlue
GR.Axes(2).AutoScale = False
GR.Axes(2).Minimum = 0
GR.Axes(2).Maximum = 255
GR2.Axes(2).AutoScale = False
GR2.Axes(2).Minimum = 0
GR2.Axes(2).Maximum = 255
GR3.Axes(2).AutoScale = False
GR3.Axes(2).Minimum = 0
GR3.Axes(2).Maximum = 2.55

Temperatura = 0
tiempo = 0
contador = 0
llave = True

servidor.Protocol = sckTCPProtocol
servidor.LocalPort = 7381
servidor.RemotePort = 0
servidor.Listen

End Sub

Private Sub Form_Unload(Cancel As Integer)

servidor.Close

End Sub

Private Sub servidor_ConnectionRequest(ByVal requestID As Long)

servidor.Close
servidor.Accept requestID

End Sub

Private Sub servidor_DataArrival(ByVal bytesTotal As Long)

servidor.GetData Variable
Select Case Variable
Case "T"
contador = 1
Case "P"
contador = 2
Case "H"
contador = 3
End Select
If contador = 1 And Variable <> "T" And Variable <> "P" And Variable <> "H" Then
GR.ChartXvsY tiempo, Val(Variable)
Label2.Caption = Val(Variable) & " Grados Celsius"
contador = 0
List1.AddItem (Variable & " Grados Celsius")
End If
If contador = 2 And Variable <> "T" And Variable <> "P" And Variable <> "H" Then
GR2.ChartXvsY tiempo, Val(Variable)
Label3.Caption = Val(Variable) & " Hecto pascales"
contador = 0
List1.AddItem (Variable & " Hecto pascales")
End If
If contador = 3 And Variable <> "T" And Variable <> "P" And Variable <> "H" Then
GR3.ChartXvsY tiempo, Val(Variable)
tiempo = tiempo + 1
Label5.Caption = Val(Variable) & " %"
contador = 0
List1.AddItem (Variable & " %")
End If

End Sub

Private Sub servidor_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)

servidor.Close

End Sub
 
Cuando pruebo ambos (cliente y servidor) en mi maquina, anda bien, pero cuando pruebo el servidor en otra maquina, no recibe los datos que envia el cliente.

Empecemos por ahi mientras veo el codigo, normalmente (en un 90% de los casos) cuando es en dos equipos o via internet lo que evita que funcione es porque los firewall (o antivirus si dispone de esta opcion) están bloqueando al puerto...

veo que utilizas el 7381 dale permiso en el firewall en donde coloques el servidor unicamente..

otra es que la direecion en el cliente no coincide con la direccion del servidor, puedes poner el nombre del equipo o su ip verificalo poniendo inicio->command-> tecleas "ipconfig" y te desplega la direccion del equipo

sigo viendo el codigo...

Edito:

parece correcto el código (un par de detalles pero no interfeiren en la conexion) te sugeriria que insertes el siguiente codigo en el cliente para verificar la conexion

Código:
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
 Winsock1.Close
 msgbox "ERROR CONNECTION"
End Sub

si te aparece "error connection" si se esta bloqueando el puerto...
 
Última edición:
Ok, y con respecto al puerto 7381, me lo dejo asi o me recomendas que lo cambie por otro?
Te agradesco muchisimo que hayas visto el codigo.
CUalquier cosa te comento como funciona.
Saludos.
 
Hola, le mande el programa servidor a un amigo y cuando el lo ejecuta no le anda muy bien. Le llegan los datos pero no todos. Encambio cuando pruebo el servidor en mi maquina me anda de 10. Es un bajon esto, la verdad ya no se que pensar.
 
Hola, le mande el programa servidor a un amigo y cuando el lo ejecuta no le anda muy bien. Le llegan los datos pero no todos. Encambio cuando pruebo el servidor en mi maquina me anda de 10. Es un bajon esto, la verdad ya no se que pensar.

ese es uno de los detalles que pude observar... necesitas implimentar un buffer en el algoritmo de recepcion, no es la misma velocidad de transmision en una maquina local que una en el otro lugar...
para la recepcion y/o transmision de de datos al micro yo recomiendo se utilice el DTR y RTS del puerto serial (PC/uC)...

solucionando ambos... solucionas la parte de los datos....

cliente.LocalPort = 0
servidor.RemotePort = 0

estas dos lineas no son necesarias...

saludos...
Saludos
 
Última edición:
Hola Lubeck, tanto tiempo. ¿Como estas?
Con todo este codigo que te habia mostrado hace varios meses atras mas un poco de electronica pude armar el proyecto que tanto queria para presentar en la facultad. Me fue bien gracias a Dios.
Ahora quiero ver de comenzar a armar otro proyecto pero se me cruzó una gran duda: ¿Se pueden controlar los graficos de Autocad con Visual Basic 6.0?
En principio es eso lo que necesito saber para ver si voy por buen camino con lo que se me acaba de ocurrir.
Desde ya muchisimas gracias por haber respondido siempre a mis preguntas.
Un gran saludo.
 
Atrás
Arriba