TODOPIC

Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: fastyx en 31 de Julio de 2006, 09:44:37

Título: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 31 de Julio de 2006, 09:44:37
Amigos: necesito hacer un graficador en vb para una placa que controla el pid de un motor de cc.

con printf saco el valor de los pulsos del encoder por el puerto serie. Mi pregunta es : despues de setear el puerto en vb , abrirlo  etc...

cual es el elemento que contiene los datos que yo saco por printf? es mscomm1.input? de ser asi como puedo asignarle una variable a este elemento o el que sea para despues cargar esos datos en una funcion graficable?

desde ya gracias ,estuve mirando los ejemplos pero todos asignan los valores para mostrarlos por un textbox y no se como tomarlos de alli
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: Toph en 31 de Julio de 2006, 19:00:23
Citar
Mi pregunta es : despues de setear el puerto en vb , abrirlo  etc...

cual es el elemento que contiene los datos que yo saco por printf? es mscomm1.input? de ser asi como puedo asignarle una variable a este elemento o el que sea para despues cargar esos datos en una funcion graficable?

 :) efectivamente fastyx es mscomm1.input, y para asignarle una variable a este elemento es sencillo, simplemente declaras la variable

Código: [Seleccionar]
dim variable as string
y para asignarle el valor que lees del puerto serie asi:
Código: [Seleccionar]
variable = MSComm1.Input
Citar
desde ya gracias ,estuve mirando los ejemplos pero todos asignan los valores para mostrarlos por un textbox y no se como tomarlos de alli

si los quieres tomar de un textbox seria asi:

Código: [Seleccionar]
variable = Text1.Text
saludos  :-)
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 31 de Julio de 2006, 21:26:33
gracias !!Tania por la contestación. Lo que me restaria saber es si ese contenido de variable , es decir que cuando yo use esa variable para graficar puntos , van a ir tomando los puntos los valores momentaneos de variable.

espero haberme explicado :lol:
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: BrunoF en 01 de Agosto de 2006, 00:55:15
Hola fastyx.
Para dibujar un punto cada vez que recibes la informacion a traves del puerto serie, debes poner la rutina o bien hacer una llamada a ella en el evento "comEvReceive" que podras encontrar en el programa.

Supongamos que tu envias una cadena de texto cada vez que obtienes un solo valor.
En ese caso, entonces no restaria mas que leer el valor desde el MSComm1.Input y enviarlo a la grafica.
Cabe destacar que la grafica tiene 2 ejes, el X y el Y.Como solo tienes 1 valor, es recomendable que a la variable X la vayas autoincrementando para ir generando la grafica. La variable Y sera entonces la que variará.

Aqui te posteo un codigo de ejemplo para que lo veas partiendo del programa que ya tienes.

Código: Visual Basic
  1. Option Explicit
  2.  
  3. Dim VariableX As Single
  4.  
  5. Private Sub Form_Load()
  6. With MSComm1
  7. .CommPort = 1              ' Se usara el puerto Com1
  8. .Settings = "19200,N,8,1"   ' Velocidad de Tx 19200 baud, no paridad, 8 bits de datos, y 1 bit de stop
  9. .InputMode = comInputModeBinary
  10. .InputLen = 0              ' El control MSComm leera todo el contenido del búfer de recepción
  11. .RThreshold = 1
  12. .RTSEnable = True
  13. .SThreshold = 1
  14. .PortOpen = True
  15. End With
  16. Grafica.DrawWidth = 3
  17. End Sub
  18.  
  19. Private Sub CmdEnviar_Click()
  20. MSComm1.InBufferCount = 0     'reseta el buffer de recepcion
  21. MSComm1.Output = TxtEnviar.Text & Chr$(13)
  22. Do While MSComm1.OutBufferCount > 0
  23. Loop
  24.  
  25. End Sub
  26.  
  27. Private Sub CmdSal_Click()
  28. MSComm1.PortOpen = False
  29. End
  30. End Sub
  31.  
  32. Private Sub MSComm1_OnComm()
  33. Select Case MSComm1.CommEvent
  34.     Case comEvReceive
  35.         Dim VariableY As String
  36.         VariableY = MSComm1.Input
  37.         If IsNumeric(VariableY) Then 'Si el valor recibido es un valor numerico entonces...
  38.            VariableX = VariableX + 50 'Autoincrementar posicion X
  39.            Grafica.PSet (VariableX, Grafica.Height - CSng(VariableY)), vbRed 'Dibujar punto en la grafica e invertir eje Y
  40.        End If
  41.     End Select
  42. End Sub

Saludos.
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: Toph en 01 de Agosto de 2006, 20:29:46
Citar
gracias !!Tania por la contestación. Lo que me restaria saber es si ese contenido de variable , es decir que cuando yo use esa variable para graficar puntos , van a ir tomando los puntos los valores momentaneos de variable.

espero haberme explicado

cada vez que recibas algo tienes que pasar por  la sentencia variable = mscomm1.input , y ahi se le asigna lo que esta en el puerto serie a variable para poderlo graficar, como esta en el ejemplo muy bueno que posteo BrunoF  :-)
solo queria destacar que aveces por el tipo de datos o el tamaño del picture que estamos utilizando es necesario multiplicar los datos o el eje x por algun valor, incluso jugar con el tamaño del picture para ver mejor los datos en la grafica en un proyecto que hice tuve que jugar con las variables asi para poder ver la grafica:
Código: [Seleccionar]
Grafica.PSet (VariableX, Grafica.Height/2 - CSng(VariableY*20)), vbRed
   :-/

saludos  :)
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 01 de Agosto de 2006, 23:00:15
gracias por la contestacion Tania.

te paso el codigo a ver si me das una mano ya que yo pretendo graficar con circlepara verlo mejor
esta es la parte modificada de brunof
Private Sub MSComm1_OnComm()
Dim Y As Variant
Dim X As Integer


Select Case MSComm1.CommEvent
    Case comEvReceive
        TxtRecibir.Text = TxtRecibir.Text & StrConv(MSComm1.Input, vbUnicode) & vbCrLf
        TxtRecibir.SelStart = Len(TxtRecibir)
        Y = TxtRecibir.Text
        X = 100
        grafica.Circle (Y * 0.2, X), 0.5
    End Select
End Sub

si pongo Y = txtrecibir.txt me da error de compilacion porque las variables no se pueden colocar en circle( con pset me pasa lo mismo).
si pongo Y =  Len(TxtRecibir) lo grafica , pero no es lo que necesito porque no grafica los valores,pero lo use para ver si entraba (debug)

no le puedo encontrar la vuelta... :?


Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: BrunoF en 02 de Agosto de 2006, 00:41:44
Ya te he respondido a esta duda en otro post(http://www.todopic.com.ar/foros/index.php?topic=13177.msg76289#msg76289 (http://www.todopic.com.ar/foros/index.php?topic=13177.msg76289#msg76289)). Por favor postea sólo una vez tu duda.
Saludos.
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 02 de Agosto de 2006, 09:06:10
disculpen por las preguntas multiples.

necesitaba para hoy poder tener el graficador pero no lo pude lograr.

no se que esta pasando pero no grafica los circulos en pantalla.

aca posteo el programa entero a ver que pasa :x

Option Explicit
--------------------------------------------------------------------------
Private Sub CmdEnviar_Click()
MSComm1.InBufferCount = 0     'reseta el buffer de recepcion
MSComm1.Output = TxtEnviar.Text & Chr$(13)
Do While MSComm1.OutBufferCount > 0
Loop
End Sub
----------------------------------------------------------------
Private Sub CmdSal_Click()
MSComm1.PortOpen = False
End Sub
----------------------------------------------------------------
Private Sub COM2_Click()
If MSComm1.PortOpen = True Then
  MSComm1.PortOpen = False
End If
With MSComm1
.CommPort = 2          ' Se usara el puerto Com2
.Settings = "9600,N,8,1"   ' Velocidad de Tx 19200 baud, no paridad, 8 bits de datos, y 1 bit de stop
.InputMode = comInputModeBinary
.InputLen = 0              ' El control MSComm leera todo el contenido del búfer de recepción
.RThreshold = 1
.RTSEnable = True
.SThreshold = 1
.PortOpen = True
End With
ledcom2.BackColor = &HFF00&
ledcom3.BackColor = &HFF&
End Sub
------------------------------------------------------------
Private Sub COM3_Click()
If MSComm1.PortOpen = True Then
  MSComm1.PortOpen = False
End If
With MSComm1
.CommPort = 3         ' Se usara el puerto Com3
.Settings = "9600,N,8,1"   ' Velocidad de Tx 19200 baud, no paridad, 8 bits de datos, y 1 bit de stop
.InputMode = comInputModeBinary
.InputLen = 0              ' El control MSComm leera todo el contenido del búfer de recepción
.RThreshold = 1
.RTSEnable = True
.SThreshold = 1
.PortOpen = True
End With
ledcom3.BackColor = &HFF00&
ledcom2.BackColor = &HFF&
End Sub

--------------------------------------------------------------

Private Sub limpiadatos_Click()
TxtRecibir = " "
End Sub
--------------------------------------------------------------
Private Sub MSComm1_OnComm()
Dim Y As String
Dim X As Integer


Select Case MSComm1.CommEvent
    Case comEvReceive
        Y = MSComm1.Input
        TxtRecibir.Text = TxtRecibir.Text & StrConv(Y, vbUnicode) & vbCrLf
        'TxtRecibir.SelStart = Len(TxtRecibir) '¿? ¡innecesario!
        X = 100
         if isnumeric(Y) then grafica.Circle (grafica.height - csng(Y) * 0.2, X), 0.5
    End Select
End Sub

te cuento que si comento la parte de  TxtRecibir.SelStart = Len(TxtRecibir) ,no leo la actualizacion de los datos en el textbox
lo que decis de x es correcto ,luego la voy a usar para cargar tiempos desde el pic , pero ahora no importa estoy midiendo en que posicion se detiene el motor

     



     
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: BrunoF en 02 de Agosto de 2006, 14:31:41
Hola.¿Estas teniendo otro error o no logras ver nada en la grafica?

Si lo que sucede es que no logras ver nada, proba cambiando:

if isnumeric(Y) then grafica.Circle (grafica.height - csng(Y) * 0.2, X), 0.5

por:

if isnumeric(Y) then grafica.Circle (grafica.height - csng(Y) * 0.2, X), 50, vbred

Asegurate que el valor que llega por el puerto *0.2 se encuentre dentro de las dimensiones de la grafica. Sino el circulo va a dibujarse pero no vas a poder verlo.
Saludos.
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 02 de Agosto de 2006, 21:01:42
brunof: se pudre todo cuando en la grafica intento colocar Y , ya que me pone error 13 en tiempo de ejecucion , no coinciden los tipos y señala a la linea en donde esta grafica.circle ( y,x ),1.si reemplazo la Y por otra X , los puntos aparecen ( en realidad uno solo pero lo hago para saber que estoy en pantalla)

te recuerdo que tengo el mscomm1.InputMode = comInputModeBinary

 no se que corno pasa que no me permite hacer ese cambio de variables :8}
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: BrunoF en 02 de Agosto de 2006, 21:19:59
Hola. Por favor. Posteame los datos que estas recibiendo.
Setea la propiedad "Autoredraw" de la grafica a "True".

Agrega esta linea:
msgbox Y
antes de:
if isnumeric(Y) then grafica.Circle (grafica.height - csng(Y) * 0.2, X), 50, vbred

y decime lo que aparece.

Debes estar enviando los datos mal.
Saludos.
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 02 de Agosto de 2006, 21:27:59
hice otra prueba : en la parte que dice if isnumeric(variableY) then....
le puse un cambio de color al form y no cambió , quiere decir que no esta entrando en el if porque Y no es una variable numerica
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 02 de Agosto de 2006, 21:29:40
justo me estabas mandando un mensaje .ahora hago lo que me decis y te cuento
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 02 de Agosto de 2006, 21:37:49
autoredraw esta en true, y con respecto al msgbox aparece un boton con aceptar
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: BrunoF en 02 de Agosto de 2006, 21:40:22
Sólo el aceptar? debería mostrar el dato que llego por el puerto serie...
Tal vez tengas mal configurados los parametros del MSComm
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 02 de Agosto de 2006, 23:13:02
no se ,aca te mando la parte de configuracion del puerto y la subrutina de mscomm1.on_com

--------------------------------------------------------------------------------------------------------------------
Private Sub COM3_Click()
If MSComm1.PortOpen = True Then
  MSComm1.PortOpen = False
End If
With MSComm1
.CommPort = 3         ' Se usara el puerto Com3
.Settings = "9600,N,8,1"   ' Velocidad de Tx 9600 baud, no paridad, 8 bits de datos, y 1 bit de stop
.InputMode = comInputModeBinary
.InputLen = 0              ' El control MSComm leera todo el contenido del búfer de recepción
.RThreshold = 1
.RTSEnable = True
.SThreshold = 1
.PortOpen = True
End With
ledcom3.BackColor = &HFF00&
ledcom2.BackColor = &HFF&
End Sub
------------------------------------------------------------------------------------------

Private Sub limpiadatos_Click()
TxtRecibir = " "
End Sub
------------------------------------------------------------------------------------------------------------
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
    Case comEvReceive
        Dim VariableY As String
         TxtRecibir.Text = TxtRecibir.Text & StrConv(MSComm1.Input, vbUnicode) & vbCrLf
         TxtRecibir.SelStart = Len(TxtRecibir)                                                                  '  ¿? ¡innecesario!
         VariableY = MSComm1.Input
        MsgBox VariableY                                                                                              'aca puse lo que me dijiste                                                                               
        If IsNumeric(VariableY) Then
        VariableX = VariableX + 100                                                                              'Autoincrementar posicion X
        grafica.Circle (grafica.Height - CSng(VariableY), VariableX), 500, vbRed              'Si el valor recibido es un valor numerico entonces...
        grafica.BackColor = &HFF00FF                                                                            '   como debug para saber si entra en el if !!!
   End Select
End Sub
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: BrunoF en 02 de Agosto de 2006, 23:20:34
Hola. Probalo asi y decime que te muestra el cuadro de mensaje que aparece.

Dim VariableX as integer

Private Sub COM3_Click()
If MSComm1.PortOpen = True Then
  MSComm1.PortOpen = False
End If
With MSComm1
.CommPort = 3         ' Se usara el puerto Com3
.Settings = "9600,N,8,1"   ' Velocidad de Tx 9600 baud, no paridad, 8 bits de datos, y 1 bit de stop
.InputMode = comInputModeBinary
.InputLen = 0              ' El control MSComm leera todo el contenido del búfer de recepción
.RThreshold = 1
.RTSEnable = True
.SThreshold = 1
.PortOpen = True
End With
ledcom3.BackColor = &HFF00&
ledcom2.BackColor = &HFF&
End Sub
------------------------------------------------------------------------------------------

Private Sub limpiadatos_Click()
TxtRecibir = " "
End Sub
------------------------------------------------------------------------------------------------------------
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
    Case comEvReceive
        Dim VariableY As String
         VariableY = MSComm1.Input
         TxtRecibir.Text = TxtRecibir.Text & StrConv(VariableY, vbUnicode) & vbCrLf
         TxtRecibir.SelStart = Len(TxtRecibir)                                                                  '  ¿? ¡innecesario!
        MsgBox VariableY                                                                                              'aca puse lo que me dijiste                                                                               
        If IsNumeric(VariableY) Then
        VariableX = VariableX + 100                                                                              'Autoincrementar posicion X
        grafica.Circle (grafica.Height - CSng(VariableY), VariableX), 500, vbRed              'Si el valor recibido es un valor numerico entonces...
        grafica.BackColor = &HFF00FF                                                                            '   como debug para saber si
entra en el if !!!
        end if
   End Select
End Sub

Saludos.
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 02 de Agosto de 2006, 23:34:48
lo que sale en el mesgebox son signos de pregunta variados,es como si no cargara correctamente el mscomm1.input en Variable Y.

en algun momento cuando hago muchos enter sobre el boton del mesagebox por ahi entra en el if is numeric porque aleatoriamente tomó un numero
pero me fije con depuracion f8 y la parte de ifisnumeric la pasa de largo ,no entra a la parte de graficacion,si a la anterior del txtrecibir.text
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: BrunoF en 02 de Agosto de 2006, 23:37:32
Si tenes MSN lo hablamos por ahi asi no se hace tan tedioso. Busca en mi perfil mi mail y agregame que te ayudo.
Saludos.
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 03 de Agosto de 2006, 20:10:43
a ver si me pueden ayudar con esto:

ya logre capturar los puntos :-/ :-/
me falta saber que pasa con los puntos en rojo

desde ya gracias
este es el pedazo de codigo de on-comm
-------------------------------------------------------------------------------------------
Private Sub MSComm1_OnComm()
Dim VariableYtext As String
Dim VariableY As String
Dim Der As Long
Dim Izq As Long
Select Case MSComm1.CommEvent
  Case comEvReceive
     

        VariableY = MSComm1.Input
         VariableYtext = MSComm1.Input
        TxtRecibir.Text = TxtRecibir.Text & VariableYtext & vbCrLf   'uso esta linea porque es modo texto
        TxtRecibir.SelStart = Len(TxtRecibir)
'
                    grafica.Scale (-10, 100)-(290, -100)
                    If IsNumeric(VariableY) Then                                            ' printf desde el pic sin letras ,numerico puro
                    Der = VariableY
                    VariableX = VariableX + 2
                     grafica.PSet (VariableX, Val(Der / 6)), vbGreen         'grafico derecha ; puntos en verde
                    End If
                   
                    If Asc(VariableY) = "68" Then                                             'si tiene una D adelante en el printf del pic
                    Izq = Val(MSComm1.Input)                                                ' en izq designo la parte numerica de la variable Y que tiene letra D
                    VariableX = VariableX + 2
                    grafica.PSet (VariableX, Val(Izq / 6)), vbRed              'grafico izq : puntos  en rojo(si no coloco val(izq) da error de tipos '13'
                    End If
  If VariableX > 290 Then
  grafica.Cls
  End If
  End Select

  End Sub
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: BrunoF en 03 de Agosto de 2006, 20:16:53
Hola. Cambia:

Izq = Val(MSComm1.Input)

por:

Izq = Right(VariableY, len(VariableY)-1)

Saludos.
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: BrunoF en 03 de Agosto de 2006, 20:22:40
Y te recomiendo para que sea mas facil de leer el programa y modificar, que cambies:

Código: Visual Basic
  1. If Asc(VariableY) = "68" Then

por:

Código: Visual Basic
  1. If left(VariableY,1) = "D" Then

Saludos.
Título: Re: que leo cuando quiero leer el puerto serie?
Publicado por: fastyx en 04 de Agosto de 2006, 01:26:09
parece que voy a tener que hacer el rtreshold de longitud variable ya que cuando mando valores de posicion del motor de 1 byte(hasta 255)
el seteo del rteshold es diferente que cuando mando valores de 3 bytes. lo probe manualmente y funciona, ahora lo tengo que hacer y conceptualmente lo entiendo ,pero no le engancho el lenguaje

seria algo asi:

leer cuantos bytes se mandaron( lo uedo conocer por el retorno de carro o nueva linea)
esa cantidad de bytes es el valor de rtreshlold salvo que se le agregue por lo del identificador D

voy a seguir peleandola...