Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?
09/08/2010 #81

Avatar de ByAxel

Respuesta: puerto serial en visual basic
OZONO dijo: Ver Mensaje
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
11/08/2010 #82


Respuesta: puerto serial en visual basic
Muchas Gracias!
Ya lo estoy viendo...
Saludos a toda la comunidad
Mauricio
22/08/2010 #83


Respuesta: puerto serial en visual basic
Gradmaster dijo: Ver Mensaje
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.
22/08/2010 #84


Respuesta: puerto serial en visual basic
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...
22/08/2010 #85


Respuesta: puerto serial en visual basic
Muchisimas gracias Lubeck.
Saludos.
Chau.
22/08/2010 #86


Respuesta: puerto serial en visual basic
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.
22/08/2010 #87


Respuesta: puerto serial en visual basic
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...
22/08/2010 #88


Respuesta: puerto serial en visual basic
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.
22/08/2010 #89


Respuesta: puerto serial en visual basic
HAber lo primero que veo...

Código:
Dim valor As String, YE as Integer
'recoge el valor de entrada
If MSComm1.CommEvent = comEvReceive Then
Valor = MSComm1.Input
YE = Asc(Valor)
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
Valor = MSComm1.Input
YE = Asc(Valor)
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...
22/08/2010 #90


Respuesta: puerto serial en visual basic
Lo corregi y me sigue tirando el mismo error.
El error me lo tira despues de leer por segunda vez el puerto, el error es en YE=Asc(valor).
22/08/2010 #91


Respuesta: puerto serial en visual basic
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???
22/08/2010 #92


Respuesta: puerto serial en visual basic
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
23/08/2010 #93


Respuesta: puerto serial en visual basic
Hola, ya lo solucione , el ultimo codigo que te mande es el que uso. El resto era ajustar la velocidad a la que el micro multiplexa los canales del conversor AD.
Saludos.
Chau.
28/08/2010 #94


Respuesta: control winsock en visual basic 6.0
Hola, estimado Lubeck, tengo un problema con un programa que usa el winsock.
Me podrias dar una mano?
Desde ya perdona las molestias.
Saludos.
28/08/2010 #95


Respuesta: puerto serial en visual basic
Lo intento...

podrías subirlo y mas o menos explicar el problema...

saludos...
28/08/2010 #96


Respuesta: puerto serial en visual basic
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
28/08/2010 #97


Respuesta: puerto serial en visual basic
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...
28/08/2010 #98


Respuesta: puerto serial en visual basic
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.
28/08/2010 #99


Respuesta: puerto serial en visual basic
y con respecto al puerto 7381, me lo dejo asi o me recomendas que lo cambie por otro?
mira yo siempre uso el 888 por costumbre...

hay algunos que estan restingidos o podria causar conflictos para abrirlo...

verifica esta lista o similar...
http://www.internautas.org/archivos/port-numbers.txt
29/08/2010 #100


Respuesta: puerto serial en visual basic
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.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.