Autor Tema: comunicacion RS232 en Visual Basic  (Leído 223064 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ardnax

  • PIC10
  • *
  • Mensajes: 9
RE: comunicacion RS232 en Visual Basic
« Respuesta #30 en: 19 de Enero de 2005, 07:54:00 »
Detecta lector/escritoe y una tarjeta dentro de el.
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
" Constantes para los códigos de control
Const STX = 2
Const ETX = 3
Const EOT = 4
Const SOH = 1
Const ENQ = 5
Const ACK = 6
Const NAK = 21
Const ETB = 23
Const ESC = 27
Private Sub Command1_Click() "botón que transmite el precio
Dim datos As String
Dim dato As String
" Envía una descripción y un precio de prueba
serie.Output = Chr(EOT) + Chr(STX) + "88" + "218" + "0" + Chr(ETX)
serie.InputLen = 1
dato = serie.Input
If dato <> "" Then
dato = Hex(Asc(dato))
Text1.Text = dato
Else
ms
End If

End Sub
Private Sub Form_Load()
" Los parámetros de apertura del puerto se han definido en tiempo de diseño, y dependen de la báscula.
serie.PortOpen = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
serie.PortOpen = False
End Sub
Private Sub Timer1_Timer()
serie.Output = Chr(EOT) + Chr(ENQ)
End Sub


elmechu

  • Visitante
RE: comunicacion RS232 en Visual Basic
« Respuesta #31 en: 30 de Enero de 2005, 13:05:00 »
Hola, que tal, soy de colombia, descarqué el zip que está al principio del foro y le corregí el error del "public". Mi pregunta es ¿esa aplicacion funciona para toda comunicacion por el puerto? Pregunto esto porque tengo unas tarjetas de una maquina de analisis de gases y necesito saber que informacion envian, y si ese programa funciona para esto o necesito algo mas

Saludos

Desconectado ardnax

  • PIC10
  • *
  • Mensajes: 9
RE: comunicacion RS232 en Visual Basic
« Respuesta #32 en: 20 de Febrero de 2005, 08:34:00 »

Desconectado garamendi

  • PIC10
  • *
  • Mensajes: 1
RE: comunicacion RS232 en Visual Basic
« Respuesta #33 en: 27 de Marzo de 2005, 10:28:00 »
Hola
       Antes que nada agradezco a todos porque leyendo el foro encontre muchas respuestas a cuestiones que tenia para resolver ; espero llegado el momento serles util a Uds tambien ,
Ahora quisiera hacerles llegar una duda  :

¿ puedo hacer un programa en Vbasic que realice una tarea cada 500 mseg ( por ejemplo leer una temperatura cada 500 Mseg exactos , ya que he estado investigando y aparentemente en sistemas multitarea no se puede hacer esta toma de lecturas con la exactitud )
Quizas para sea obvia la respuesta ; pero estoy comenzando a estudiar vbasic y necesito saver si lo puedo hacer asi o si debo solucionarlo via hard al problema .
Aguardo sus comentarios .

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
RE: comunicacion RS232 en Visual Basic
« Respuesta #34 en: 27 de Marzo de 2005, 13:27:00 »
Introduce un objeto Timer en tu formulario. Una de sus propiedades es Interval, y tendras que poner ahi el numero de milisegundos con el que quieres que se lance el evento OnInterval, donde podras poner tu codigo.
Desconozco si es muy preciso, pero en teoria deberia serlo.

Desconectado hhpp

  • PIC12
  • **
  • Mensajes: 99
RE: comunicacion RS232 en Visual Basic
« Respuesta #35 en: 18 de Abril de 2005, 19:22:00 »
Hola maestros,bueno solicito una ayudotaaaaaaaa,miren esoty recibiendo datos del ADC en VB el prboblema esque cuando recibo, el textbox que uso se llena de datos al tiro, y no pues asi no me sirve,lo otro esque yo vi el ejem`lo para basse de datos que tiene con acces y bueno para guardar undato lo hacen con update cxada que se oprime un command button ahoraa lo que yo quisieras es:
1ª recibir los datos pero qure no se llene y que a cada instante me muestre el dato correcto(es decir como si borrara el antreriro dato y reciba el otro pero de manera innotable) y a la vez lo gusrade automaticamente en la base da datos(acces),pero no se como hacer esto????????????
2ª Que es lo mejor,¿ hacer la conversion de los datos adquiridos en el microcontrolador o en La PC?,el que yo tengo realiza la conversio a bcd y kluego a ascii osea todo en el micro.
Por favor si alguien de ustedes puede ayudarme,o decirme donde pueden ayudarme se los agradecere.

Espero me ayuden maestros.
Gracias de antemano.

Hp

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
RE: comunicacion RS232 en Visual Basic
« Respuesta #36 en: 19 de Abril de 2005, 00:17:00 »
Lo que te pasa con el Textbox es que estás añadiendo información a la que había en lugar de sustituir la vieja por la nueva.
Si quieres esto último, lo único que tienes que hacer es Text1.text=ValorRecibido

Con respecto a almacenar los valores en una base de datos, no es difícil, pero sí lo suficientemente complejo como para explicarlo aquí. Te recomiendo que leas este artículo que te resultará bastante clarificador:
http://www.elguille.info/vb/bases/indiceDAO.asp

Por último, ¿donde es mejor hacer la conversión de los datos?, pues dependerá de la aplicación, del tiempo libre que tenga el PIC, del tiempo libre que tenga el PC, de la información que se necesita para realizar la conversión,... Son muchos los factores que pueden influir en esta decisión. Prueba, si quieres a hacerla en uno de ellos y si te encuentras con alguna difícultad lo intentas con el otro.

Desconectado hhpp

  • PIC12
  • **
  • Mensajes: 99
RE: comunicacion RS232 en Visual Basic
« Respuesta #37 en: 19 de Abril de 2005, 18:40:00 »
hola y gracias por responder maestro, bueno mira como me dices:
recivir=mscomm1.input
text1.text=recivir
y para el último dato
text2.text=text1.text
 verdfad, pero quer pasa con los anteriores datos se iran llenandoç, no existrira sobreflujo?

Ahora como haria para que en diferentes textbox(6) me den medidas distintas pertenecientes a los 6 canales adc.

buewno y sobre la base de datos ahora tengo una preguntaç, cual usar
ADO o DAO, segùn lei ADO es lo que reemplazara a DAO, ahora por favor te agradeceria que me digas cual usar debido a las ventajas que tiene dao 0 ado.

gracoias por toido.
hp

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
RE: comunicacion RS232 en Visual Basic
« Respuesta #38 en: 20 de Abril de 2005, 00:49:00 »
Pues no entiendo porqué se te van llenando. Teóricamente, con esas líneas que indicas, los Text Box deberían recoger en cada ciclo nueva información, no acumularla a lo que ya hubiera. Es probable que el problema esté en otra parte del programa.

Para hacer lo de poner 6 lecturas en sus respectivos lugares, se me ocurre que implementes un mini-protocolo. Es decir, cada lectura irá precedida de un código que identifica de qué canal ADC se trata. Y en tu programa tendrías que ir fraccionando los datos recibidos entre código y lectura, para a continuación, asignar al Text box que corresponda.

Además, si vas a usar 6 con la misma estructura, lo más recomendable sería hacerlo con un array de controles Text Box, de esta manera, el código final de asignación te saldría mucho más corto y legible:
Text[n]=Lectura[n]

Con respecto a las ventajas de ADO o DAO no tengo ni idea. Supongo que habrá alguna página que los compare.

Desconectado Caliz23

  • PIC10
  • *
  • Mensajes: 2
RE: comunicacion RS232 en Visual Basic
« Respuesta #39 en: 20 de Abril de 2005, 08:56:00 »
Compadre ustedes no sabran algo de RTU Remotas de control de procesos...
estoy en desarrollo de un driver y necesito pasar la complilacion de Un lenguaje "ACCOL" para el rtu necesito hacer una especie de COM y no se como me podrian Ayudar compadres caliz23@mail.com esta es mi direccion por alguna cosa Gracias de ante mano...

Desconectado hhpp

  • PIC12
  • **
  • Mensajes: 99
RE: comunicacion RS232 en Visual Basic
« Respuesta #40 en: 20 de Abril de 2005, 19:06:00 »
Hola maestro bien ahi va la idea, mira si en el programa delpic mandaria digamos una "a" para el primer canal una "b" para el segundo canal y asi sucesivamente ..-....
ahora en VB seria asi?
pa el canal 0
if mscomm1.input="a" then
   var=mscomm1.input
   textarray(0)=var
...
pa elcanal1
 if mscomm1.input="b" then
   var=mscomm1.input
   textarray(1)=var
...

por favor ayudame eso de maejar bits en VB  no lo tengo cLARO,Y SI LA IDEA VA BIEN DAME UNA MANITO POTR FAVOR.

SAULDOS
HP.

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: comunicacion RS232 en Visual Basic
« Respuesta #41 en: 20 de Abril de 2005, 19:43:00 »
Por fin me hago de un momento para pasar por acá...

usuario_registrado:
Tratá de registrarte en el foro porque hay un montón de "usuario_registrado" y no se sabe quien es quien.

El objeto Timer de VB no es para nada preciso. Es bastante aproximado, pero no sirve para sincronizar correctamente con un Pic, que es mucho mas exacto. Depende mucho de la ocupación del procesador en el intervalo de tiempo que cuenta y como Windows tiene la costumbre de tener subprocesos corriendo en segundo plano (algunos que ni siquiera aparecen en el administrador de tareas) NO te va a servir si querés cierta exactitud. Yo ya lo comprobé en infinidad de situaciones. Una mejora es utilizar la API de Windows que se ocupa de los timers, pero tampoco mejora demasiado.
La solución pasa por otro lado, si lo que buscás es leer por el puerto serie cada cierto intervalo de tiempo te conviene programar el pic para que envíe los datos cada 500ms y hacer un "protocolo" casero para manejar los mensajes.
Seguí leyendo que más adelante te doy una solución que te puede funcionar...

************************

hhpp:
La solución que aporta Nocturno debería funcionar... pero me parece que te estás olvidando de algo más. Existen propiedades del objeto MsComm que sirven para gestionar el buffer de entrada y salida del puerto serie que si no están bien configuradas te hacen el error que mencionás.
Hasta donde yo entiendo vos leés el puerto cada intervalos de tiempo o presionando un botón en el formulario (en el evento Button_Click). El problema pasa porque en el momento que vos leés el puerto, en el buffer de recepción tenés 5 o 6 datos acumulados que ya te envió el pic. Tomemos un ejemplo:
El pic te manda un dato cada 500ms... vos leés el puerto cada 2 segundos. Mientras el pic envía la pc guarda los datos en el buffer (que es una memoria temporal) hasta que se lean. En el momento que se leen los datos se vacía el buffer. Entonces, a los 2 segundos, te va a devolver una cadena conteniendo los 4 datos seguidos (500ms x 4 = 2 segundos). Se entiende?

Ahora bien, la solución:
Manejar la comunicación por eventos! Acá va un ejemplo, supongamos que el control MsComm en tu formulario se llama "Comm".

Private serie as String
Private buffer as String
Private buffer2 as String

Private Sub Form_Load()  "Configurar el puerto ni bien arranca el programa...
    Comm.CommPort = 1    "Puerto com1
    Comm.Settings = "19200,N,8,1"    "Velocidad, paridad, etc...
    Comm.InputLen = 0                       "Explicado después.
    Comm.RThreshold = 1                    "Produce el evento OnComm cada 1 caracter.
    Comm.PortOpen = True                 "Abre el puerto.

End Sub

"Comm.InputLen = 0" es la cantidad de caracteres que va a leer cada vez que se hace un Input, si le ponés 5 te va a leer 5 nomás, si hay 20 no te va a vaciar el buffer, te va a dejar 15 en espera. Con 0 le decís que lea TODO el buffer y que lo vacíe completamente en cada lectura.
"Comm.RThreshold = 1" no hace exactamente lo que dice... pero bueno. Funciona bien así, tendría que disparar un evento por cada caracter recibido pero lo dispara cuando encuentra un retorno de carro ASCII "13". Mejor!

Después generamos el evento...

Private Sub Comm_OnComm()
    If Comm.InputLen > 7 Then
        Comm.PortOpen = False
        Comm.PortOpen = True
        Exit Sub
    End If
   
    buffer = Comm.Input
    If buffer = "" Then Exit Sub
   
    buffer2 = Left$(buffer, Len(buffer) - 1)
    Text1.Text = buffer2
        Call ControlSerie
   
End Sub

Esto es fácil, el pic envía un dato seguido del ASCII 13, cada vez que MsComm encuentra un ASCII 13 salta el evento OnComm. Entonces lo que hay que hacer es enviar los datos seguido ahí nomas de un ASCII 13.
Ahí le puse que si el buffer tenía más de 7 caracteres que lo descarte y vacíe el buffer. Esto es por si se acumulan datos (basura) en el puerto hasta que el programa termina de arrancar y estar operativo (desde la carga del form y activación del puerto hasta llegar al punto de que pueda atender las interrupciones). SOLO EN EL CASO QUE SE SEPA QUE LOS DATOS DEL PIC NO SUPERAN ESTA CANTIDAD. Se puede especificar otro valor distinto a 7 o ignorar toda la condición.
Despues está la condición de que si la cadena está vacía ("") que la ignore.
"buffer2 = Left$(buffer, Len(buffer) - 1)" es para filtrar el ASCII 13 del final de la cadena.
"Call ControlSerie" llama a otra rutina (si existe) que se encargue de hacer alguna acción dependiendo del valor de buffer2.

************************

Volviendo al tema de "usuario_registrado" (conseguite un nick!!!)
Protocolo "re-casero" (y fácil)
Supongamos que tenés que leer 3 pulsadores y 3 ADC"s....
En el pic te haces un programa que envíe los datos de esta manera según el caso. Te lo explico "metafóricamente" porque no sé en que lenguaje trabajás.

Pulsador 1: "1" + chr(13)
Pulsador 2: "2" + chr(13)
Pulsador 3: "3" + chr(13)

ADC1: "A" + valor1 + chr(13)
ADC1: "B" + valor1 + chr(13)
ADC1: "C" + valor1 + chr(13)

valor1..2..3 es el valor del ADC en cuestión, se manda toda la línea como una cadena (sin los +). En PicBasic sería "C",valor1,CR con CR como constante con el valor 13 (CR con 13").

El primer problema es que las cadenas tienen longitud variable.... para los pulsadores tenemos cadenas de 1 caracter mientras que para los ADC"s pueden ser de 4 o 5 caracteres (incluyendo el retorno de carro y suponiendo una conversión de 8 bytes).

La solución en VB aplicando los teoremas del ejemplo anterior es lo que sigue...
Vamos a crear el procedimiento "ControlSerie" anteriormente citado:

Public Sub ControlSerie()
    Dim largo As Byte
    Dim i As Byte
    Dim idPote As String
    Dim valPote As Integer
    On Error GoTo salir
    largo = Len(buffer2)

    If largo = 1 Then   ´Es un pulsador!!!
        Select Case buffer2
            Case "1"
                 "Acción para el pulsador nro 1.
            Case "2"
                 "Acción para el pulsador nro 2.
            Case "3"
                 "Acción para el pulsador nro 3.
        End Select

    Else
        idPote = Left$(buffer2, 1)  "Identifica si es A, B o C.
        Select Case idPote
            Case "A"
                idPote = Right$(buffer2, largo - 2)  "Ahora con el valor...
                "idPote tiene el valor de A... hacer lo que haya que hacer acá!
            Case "B"
                idPote = Right$(buffer2, largo - 2)  "Ahora con el valor...
                "idPote tiene el valor de B... hacer lo que haya que hacer acá!
            Case "C"
                idPote = Right$(buffer2, largo - 2)  "Ahora con el valor...
                "idPote tiene el valor de C... hacer lo que haya que hacer acá!
        End Select
    End If

salir:     "En caso de error se viene derecho para acá.
End Sub

********************

Espero que les sirva, por ahora me cansé de escribir, je je!!
Salu2.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
RE: comunicacion RS232 en Visual Basic
« Respuesta #42 en: 20 de Abril de 2005, 23:25:00 »
Sólo añado un pequeño comentario a la extensa explicación de Colores2.

La ventaja de usar un array de controles es no tener que hacer el programa así:
if mscomm1.input="b" then
var=mscomm1.input
textarray(1)=var

Supongamos que has recibido ya los datos y has extraido en las variables Canal y Lectura lo que te ha entregado el PIC. Directamente podrías hacer esto:

textarray(asc(Canal)-asc("a"))=Lectura

y en una sóla línea asignas la lectura al Text Box adecuado, sin tener que complicarte con IF o con SELECT CASE.

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: comunicacion RS232 en Visual Basic
« Respuesta #43 en: 21 de Abril de 2005, 06:53:00 »
Si, eso sirve. La razon de tanto Select Case e If"s es porque en mi software no manejo arrays de textbox, sinó que a partir de allí llama a otras funciones que hacen cosas diferentes entre si. Pero puede ser una buena opción. Hay que asegurarse de que el dato llegue bien para que no te dé errores de desbordamiento o similares en el caso de que asc(canal) llegue como cualquier cosa.

Salu2.

Desconectado hhpp

  • PIC12
  • **
  • Mensajes: 99
RE: comunicacion RS232 en Visual Basic
« Respuesta #44 en: 21 de Abril de 2005, 21:28:00 »
Hola y gracias por todo, buenp ahora sigo con esto miren:

private sub Form_Load();
...
..
end sub
ahpra cuando reciba (13) entrara directamente a:

private sub comm-Oncomm()
 if...
..


 end if
buffer=comm.input
if buffer=" " thjes exit

canal=Left$(buffer,len(buffer)-6)"sacamos el caracter "a" para el                                                      "          canal0
buffer2=Right(buffer,len(buffer)-1) "Aqui sacamos todo incluido(13)
                                     
lectura=left$(buffer2,len(buffer2)-1)"Aqui filtramos (13)
textarray(asc(canal)-asc("a"Giño)=lectura" aqui automaticamente según varia canal se iran acomodando.

seria asi verdad?
( da lo mismo  canal=left$(buffer,len(buffer)-6)
               lectura=mid(vuffer,2,6)
)
end  sub


Si es asi por favor un comprendido.

ahora tengo dudas como saber si vas a tener 7 caracteres en el buffer despues de la conversion(10 bits)

Lo demas tendria que mandar mi paquete desde el uC con (a+valor+13) cada 500 ms? verdad?
ahora yo desde el uC ya los estoy enviando en ascii, no afecta que ponga asc(canal)-asc("a"Giño?(solo son numerosno creo, pero por si)

Ahora como le digo a la Pc que cada 500 ms reciba los datos?


Que pasaria si yo tuviera por ejemplo el boton entradas y al hacer click sobre el me desplieguen los 6 canales reciviendo datos en todo momento sin intervalos de tiempo, como haria para que reconozca cual va a un determinado canal?, sin intervalos de tiempo? como harian los datos por que si es todo momento donde se almacenarian estos, y si van a un textbos que pasaria?

Aclarenme estas dudas por favor
Hp


 

anything