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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: comunicacion RS232 en Visual Basic
« Respuesta #45 en: 21 de Abril de 2005, 23:32:00 »
El trocito de programa que has puesto podría casi funcionar, digo "casi" porque hay errores de sintaxis (vuffer con "v"Giño, pero esa es la idea.
Yo lo simplificaría como has propuesto al final, pero usando un valor fijo en el recorte "left$":

canal=left$(buffer,1)
lectura=mid$(buffer,2,6)

Si quieres enviar una lectura cada 500 ms tendrás que indicárselo así al PIC, lógicamente, aunque en Visual Basic no tendrás que tener eso en cuenta. En VB tendrás que habilitar la interrupción por Datos serie recibidos. Joder, se me ha olvidado el VB Ardiendo y no me acuerdo del nombre del evento... algo como on_mscomm o algo así... desquiciado

Por último, no importa que tú uses los valores recibidos como caracteres ascii aunque el PIC envíe números. Ambas son maneras válidas de manejar bytes.

Desconectado IngLAOFX

  • PIC10
  • *
  • Mensajes: 43
RE: comunicacion RS232 en Visual Basic
« Respuesta #46 en: 04 de Mayo de 2005, 05:29:00 »
Hola.. respecto a este tema, yo tengo una duda:

Quiero mudar un programa que hice en un lenguaje llamado Matlab a Visaul basic, por la facilidad de crear el GUI y ademas porque matlab no es nada eficiente y es muy lento, peor me da las funciones que riequiero y la facilidad de operar el puerto serial, pero bueno...

Segun he ledio, el puerto serie controlado con el MSCOMM activa la recepcion al recibir el hexadecimal 13..?? o son 2 caracteres ascii..?? y bien.. en mi caso deseo transmitir numeros, no caracteres, y me pregunto como podria solucionar el inconveniente de tener que transmitir el dato 13H , siendo que el VB lo consideraria el fin de la transmision,  y aun me faltaria transmitir mas datos.... espero haberme dado a entender..Muchas risas

O sera que a fuerzas debo trasnformar en el PIC el dato a BCD, despues a ascii y luego transmitirlo.."????
Gana Mas Una Bruja Rentando Su Palo De Escoba A 10Euros por Vuelta Que Uno Prediciendole Un Esplendoroso Futuro A La Clase Obrera En Una Semana

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: comunicacion RS232 en Visual Basic
« Respuesta #47 en: 04 de Mayo de 2005, 21:56:00 »
hhpp:
"Ahora como le digo a la Pc que cada 500 ms reciba los datos?"
En el ejemplo "extenso" que puse mas arriba me tomé la molestia de explicar cual es (según mi parecer) la mejor manera de temporizar acciones que dependan de un tiempo exacto para la recepción de datos. Expliqué lo de el control Timer, el evento OnComm...

"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..."
Si en vez de usar eventos y datos cada 500ms querés hacerlo cuando apretás un boton, entonces no utilizás el evento OnComm. Lo que hacés es configurar el valor máximo del buffer de entrada para que guarde solamente los últimos 30 caracteres (por poner un ejemplo, si un dato ocupa 4 caracteres y tenés 6 datos 4 x 6 = 24...) y hacés input en el evento Click del boton. Vas a tener que separar los datos con algún caracter y después ir sacando de a uno los datos que están delimitados por el caracter delimitador (...24 + 6 delimitadores = 30). Problema delimitado (y redundante Payaso)

IngLAOFX:
Si usás OnComm te toma el 13 como retorno de carro, no como "fin de la transmisión". La transmisión no se termina, sólo que en ese momento salta el evento. Habría que probar con otras configuraciones de Comm.RThreshold y Comm.InputLen (que no probéGiño a ver si también disparan el OnComm. De todas maneras cambiando el RThreshold puede pasar que se dispare a una cantidad determinada de caracteres que puede no ser bueno tampoco (o si).
La solución:
1) Almacenás en una variable las sumas de los Input"s en OnComm (buffer = Comm.Input + buffer). No es recomendable...
2) Cambias el valor de Comm.RThreshold a una cantidad fija de caracteres preestablecidos (con OnComm también) y te fijás si el caracter 13 te interrumpe todo por la mitad... si no sucede, todo ok, tendrás que trabajar con cadenas de longitud fija.
3) No usás OnComm y dejás que se acumulen en el buffer hasta que se te ocurra algo.loco
4) Usas recepción binaria, que es la que se usa para recibir por ejemplo archivos. Yo no la probé, pero tiene que funcionar. El problema es que no sé como recibe los datos VB en este modo, fijate que se almacenan como arrays de bytes o algo similar. Eso te puede funcionar bien.

Nocturno: el evento de recepción es OnComm.
Off Topic: suele darme mucha curiosidad los textos que aparecen junto a su nick en MSN... y rara vez lo encuentro "disponible" en ése medio para conversar...Noche
Salu2.

Desconectado IngLAOFX

  • PIC10
  • *
  • Mensajes: 43
RE: comunicacion RS232 en Visual Basic
« Respuesta #48 en: 10 de Mayo de 2005, 21:36:00 »
Hola, ya estableci la comuniacion serial muy bien, no cabe duda que una vez que aprendes a usar el MSComm la vida se hace mas facil, pero siempre hay detallitos..:S

El datelle que me tiene sin juicio quiza se deba a mi falta de experiencia en VB, pero es el siguiente:

Cuando estoy haciendo el programa, y lo pruebo, funciona muy bien, la comunicacion se establece perfectamente, pero cuando genero el .exe del proyecto, al ejecutarlo se conecta bien al puerto, pero en ocasiones (la mayoria de las veces:S) cuando quiero leer el buffer de recepcion se empieza a llenar y el programa s queda colgado. El detalle es que yo solo espero recibir 600 bytes, y el buffer es de 1200 bytes, entonces no se por que diablos en modo de depuracion o como se le llame si funciona bien, pero una vez compilado, el ejecutable empieza a generar cosas raras con el buffer de entrada y pues, el programa se va al caño..:S

espero alguien tenga una explicacion o pista para ese problema.

Bueno, se me acaba de ocurrir que, mientras esta en modo depuracion, el programa corre mas lento que una vez ya compilado, entonces eso quizas podria generar que los comandos que le envio al pic desde la pc no se reciban bien, bueno, envio un comando y su argumento, entonces podria ser que el PIC no termine de procesar el comando recibido cuando ya esta en puerta el argumento y por eso suceden cosas raras... espero sea eso..

Saludos gente..Rebotado
Gana Mas Una Bruja Rentando Su Palo De Escoba A 10Euros por Vuelta Que Uno Prediciendole Un Esplendoroso Futuro A La Clase Obrera En Una Semana

Desconectado IngLAOFX

  • PIC10
  • *
  • Mensajes: 43
RE: comunicacion RS232 en Visual Basic
« Respuesta #49 en: 10 de Mayo de 2005, 21:57:00 »
bueno foro, ya respondi mi propia cuestion, al parecer si se debia a la rapidez con la que el programa ya compilado enviaba los datos al PIC, lo que hice para probar fue utilizar un bucle como delay con un numero muy grande, y ya no tuve el probelma anterior......Avergonzado

Pero gracias de todas maneras ya que este foro me ayudo a esclarecer algunos aspectos del mscomm.... y disculpen la molestia..Muchas risas
Gana Mas Una Bruja Rentando Su Palo De Escoba A 10Euros por Vuelta Que Uno Prediciendole Un Esplendoroso Futuro A La Clase Obrera En Una Semana

Desconectado hhpp

  • PIC12
  • **
  • Mensajes: 99
RE: comunicacion RS232 en Visual Basic
« Respuesta #50 en: 16 de Mayo de 2005, 16:50:00 »
Hola a todos y gracias bueno ahora tengo otro problema, miren  estoy enviando desde el pic como sigue:
                            A3.11113
                            B4.56713
-..........................

pero en el momento de hacer la conexión fisica con VB me sale el siguiente error:
error 341 en tiemp de ejecución: el índice de la matriz de controles no es valido

y la verdad no se donde esta el problema, por favor una ayuda:
Private Sub MSComm1_OnComm()
Dim lectura As String
If MSComm1.InputLen > 7 Then
MSComm1.PortOpen = False
MSComm1.PortOpen = True
Exit Sub
End If
buffer = MSComm1.Input
If buffer = " " Then Exit Sub
canal = Left$(buffer, 1)
lectura = Mid$(buffer, 2, 6)
Textarray(Asc(canal) - Asc("A"Giño) = lectura
End Sub

Desconectado leonther

  • PIC10
  • *
  • Mensajes: 4
RE: comunicacion RS232 en Visual Basic
« Respuesta #51 en: 17 de Mayo de 2005, 20:50:00 »
me han ayudado mucho sus dudas y sugerencias espero ahora si terminar bien mi proyecto

Desconectado hhpp

  • PIC12
  • **
  • Mensajes: 99
RE: comunicacion RS232 en Visual Basic
« Respuesta #52 en: 18 de Mayo de 2005, 13:48:00 »
Bien ya no se que esta mal:
Option Explicit
Private buffer As String
Private canal As String
Private lectura As String



Private Sub Form_Load()
"Dim CommPort As String, Handshaking As String, Settings As String
"Dim buferentrada    As String
MSComm1.CommPort = 1        "puerto com1
MSComm1.Settings = "9600,N,8,1"
MSComm1.InputLen = 0
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()

If MSComm1.InputLen > 7 Then
MSComm1.PortOpen = False
MSComm1.PortOpen = True
Exit Sub
End If
buffer = MSComm1.Input
If buffer = " " Then Exit Sub
canal = Left$(buffer, 1)
lectura = Mid$(buffer, 2, 6)
Textarray(Asc(canal) - Asc("A")) = lectura  "va de 0 a 3
End Sub

he aqui el código t me marca el error enTextarray(Asc(canal) - Asc("A")) = lectura
los parentesis estan bien
indica que el el indice no es valido y no se por que
ayuda por favor.

hp

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: comunicacion RS232 en Visual Basic
« Respuesta #53 en: 19 de Mayo de 2005, 07:39:00 »
hhpp: "indica que el el indice no es valido y no se por que..."

Yo en el mensaje anterior:
"El segundo puede ser que lo que está adentro del parentesis "global" de un resultado que no esté dentro de los rangos de la matriz. Si textArray tiene 4 elementos empezando desde 0 entonces tenés las combinaciones textArray(0), textArray(1), textArray(2) y textArray(3). Cualquier número diferente a 0, 1, 2 o 3 te va a dar ese error"

Ese es el error que te está marcando, el numero de indice debe ser cualquier cosa.
Cuando se detiene ahí y te dá el error, pasá el cursor por encima de la variable "canal" y fijate que valor te dice que tiene. Después seleccioná toda la parte que está entre parentesis y fijate lo mismo. Vas a llegar a la conclusion de que el valor que te dá es cualquier cosa.
Como recomendación: sacá la parte que dice Asc("A") y en su lugar ponele directamente el valor, así queda menos complicado y descubrís antes el problema. De ahí en mas solo te queda saber que valor toma Asc(canal)...

Desconectado hhpp

  • PIC12
  • **
  • Mensajes: 99
RE: comunicacion RS232 en Visual Basic
« Respuesta #54 en: 21 de Mayo de 2005, 14:13:00 »
Hola colores y la verdad nose , por que hize todo y pareceria que se estuviese disparando en cadad carácter,  o talvez podria ser que el pic no esta enviando precisamente los datros cada 500ms?


Y que pasaria si recibo los datos de forma continua como los separaria ?

Gracias HP.

Desconectado IngLAOFX

  • PIC10
  • *
  • Mensajes: 43
RE: comunicacion RS232 en Visual Basic
« Respuesta #55 en: 21 de Mayo de 2005, 17:00:00 »
Hola hhpp

Pues, segun lo que vi en tu programa, RTSHold esta puesto a 1, si bien recuerdo, creo que eso es para que se dispare el evento cada vez que recibes un byte en el buffer.

No se mucho de vb, pero pienso lo siguiente, si vos recibis digamos 6 bytes, donde el primero es del canal a, y su dato, luego el canal b y su dato, y finalmente el canal c y su dato, entonces cuando recibes el primer byte correspondiente a la etiqueta que usaste para el canal A, podria ser probable que el evento no termine de procesar el dato cuando el pic ya te envio otro byte y se volvio a disparar el evento.... puede ser problemas de ese tipo.

es por eso que en ocasiones se utiliza el control de flujo, pero que te parece lo siguiente:

Primero cerciorate que el PIC haga lo suyo, si tienes el programa en ensamblador, usa el mplab para simularlo y ver que efectivamente tome las muestras cada cierto tiempo que hayas establecido, esto es lo mas mportante quizas, ya que si no funciona esta etapa, no sabras ni que pex mas delante...

En segundo lugar, si cada 500 milisegundos vas a recibir digamos los 6 bytes, tal como lo mencione antes ( pueden ser los que quieras, pero debes estar conciente de la cantidad total) entonces ajusta tu RTSHold a ese numero, así, cuando recibas todos los datos completos, de cada uno de los canales, empezaras a procesarlos, ya que en ese peiriodo de tiempo, tendras aproximadamente 500 mS en los cuales el PIC no te enviara nada mas, y el VB tendra el tiempo suficiente para procesar los datos del buffer sin que se vuelva a disparar el evento del MSComm.

Como recomendacion, vos estas mezclando caracteres con datos binarios, por lo cual te recomiendo que leas byte por byte del buffer, porque, digamos que recibes los siguientes datos : A35 , donde el 35 es un numero decimal, pues en realidad lo que recibirias seria el codigo del caracter A, y el 35 codificado en binario, pues si lees 2 bytes,  el VB te lo va a manear de una manera extraña, al menos distinto de como lo deseas hacer, es por eso que si lo lees de byte por byte, no te dara problemas, asi me sucedio a mi, y asi lo arregle.

Es una opinion, y espero te ayude en algo..Muchas risas
Gana Mas Una Bruja Rentando Su Palo De Escoba A 10Euros por Vuelta Que Uno Prediciendole Un Esplendoroso Futuro A La Clase Obrera En Una Semana

Desconectado IngLAOFX

  • PIC10
  • *
  • Mensajes: 43
RE: comunicacion RS232 en Visual Basic
« Respuesta #56 en: 21 de Mayo de 2005, 17:09:00 »
Ahhh, por cierto, qu ete parece si en lugar de utilizar lo del text array como lo usas para determinar el indice, mejor utilizas un case y quizas asi te librs de ese problema, ademas que tu codigo sera mas entendible...Muchas risas
Gana Mas Una Bruja Rentando Su Palo De Escoba A 10Euros por Vuelta Que Uno Prediciendole Un Esplendoroso Futuro A La Clase Obrera En Una Semana

Desconectado hhpp

  • PIC12
  • **
  • Mensajes: 99
RE: comunicacion RS232 en Visual Basic
« Respuesta #57 en: 30 de Mayo de 2005, 20:25:00 »
Hola amigos, que pasaria si yo recibo los datos continuamento como los separo, sigue el mismo formato, pero ahora es continuamento como separa los datos para que se vayan a sus respectivos lugares.




HP.}




Desconectado gmcorreaisaza

  • PIC10
  • *
  • Mensajes: 2
RE: comunicacion RS232 en Visual Basic
« Respuesta #58 en: 09 de Junio de 2005, 16:48:00 »
Escrito originalmente por JeanPaul1
SonrisaHolaaaaa a todos,soy nuevo acá y leyendo los correos que han enviado veo que es un lugar confiable para resolver todas las dudas,espero tambien yo ayudarles también.Lo que quiero hacer es enviar datos de la PC por el puerto serial hacia un PIC(16F877) y también otro programa de enviar datos desde el PIC hacia la PC por el puerto COM en Visual Basic pero en entorno grafico. Además también necesito el hardware necesario para el primer caso.Les agradezco por su ayuda.Si alguien conoce alguna pagina buena se los agracdecería,es urgente,byeeeeeee


Que mas jeanpaul1, sabes tengo el mismo problema tuyo y lo tengo que resolver para poder graduarme, asi que porfavor si tienes el codigo o algun ejemplo seria bueno de tu parte enviarmelo al correo gmcorreaisaza@yahoo.es me seria de gran ayuda. gracias

Att: Giovanni

Desconectado leonther

  • PIC10
  • *
  • Mensajes: 4
RE: comunicacion RS232 en Visual Basic
« Respuesta #59 en: 02 de Julio de 2005, 15:49:00 »
Escrito originalmente por IngLAOFX

Hola hhpp Pues, segun lo que vi en tu programa, RTSHold esta puesto a 1, si bien recuerdo, creo que eso es para que se dispare el evento cada vez que recibes un byte en el buffer.



Por lo que he leido tiene razon incluso el amigo colores dice que no funciona como debe, pienso que cuando lo probo no le funciono y lo tomo asi como lo entiendo: que cuando veia un ascii 13, que es como enter el saltaba al OnComm, deberas que no se yo yo que entiendo es que con el MSComm.RThreshold = X el valor de X dice cuantos bits son los que el lee del buffer deentrada para pasar al evento.
de todas formas no se mucho, mi sugerencia seria que sepas cuantos son los bits que trasmistes y le des el valor de X.
Jejejeje,

fuera de tema: me presento estoy a punto de graduarme de tecnico en Venezuela y me mandaron un proyecto con pic y una pc.
He leido sus consejos y me han resultado muy utiles pero no he logrado todavia comunicarlos.
Me mandaron hacer un telecajero de esos de los bancos bueno con sus limitaciones pero con el mismo procedimiento, sabiendo que tengo que usar un uC yo no sabia mucho y compre el 16F874 que ya tiene los de la transmision serial, planteo mi caso:
*Tengo que usar el micro y la PC
Yo mi uso el micro para que
*controle un teclado externo de 4*4 q ya lo hice
*un lector de tarjeta bajo un esquema inventado que es por medio de optoacopladores que lo tengo medio listo porque es un tanto dificil hallar la sincronización
*ademas de controlar el dispensador de monedas (no utilizamos billetes) son
monedas de una sola denominación ya esta listo use un motor dc y le invierto el giro con un Puente H y esa inversion del giro la debo controlar con el micro pero las veces que deba ser tiene que venir de la pc (eso no lo he hecho).
La Pc me sirve para:
*bueno alli tengo la base de datos ya diseñe el programa lo hice en visual Basic y lo pense como superponer una serie de pantallas segun lo que reciba del micro
tengo el programa con algunos detalles malos porque no soy muy ducho en esto de basic.
Ademas aprovecho el puerto paralelo de la máquina para imprimir por medio de ella.
bueno que mas le digo la comunicacion es serial entre uC y PC
los datos los recibo de forma externa es decir del micro nada del teclado de la maquina yo ya he probado mi programa como si fuese del teclado del pc y todo bien.
realiza 3 tipos de operaciones:
retiro
consultra de saldo
transferencia de saldo
son dos tipos de cuentas
cuenta de ahorro y cuenta corriente
creo que eso es todo
bueno mi problema es que ando clavado con lo de la comunicacion serial aqui en mi universidad me exigen de programacion cuando yo no he visto ni un lenguaje de programacion por eso pido su ayuda mas adelante les muestro lo que he ehcho gracias.