TODOPIC
Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: dannyman en 22 de Octubre de 2004, 17:43:00
-
Hola amigos un gusto y un honor compartir con ustedes..
Mi problema es el siguiente: Tengo un circuito que me da 8 salidas ( señales digitales 5v para el 1log y 0v para el 0v) lo que quiero es capturar estas 8 salidas con el puerto serial del pc usando el mscomm de visual basic.
No se si el problema es que el puerto serial maneja otros niveles de voltaje para reconocer unos o ceros logicos o si estoy almacenando en una variable equivocada a las señales digitales del circuito o tengo que usar algo mas que las func del mscomm... nose la verdad es que ya estoy un poco desesperado...
Les voy a agradecer infinitamente al que me pueda ayudar o darme una pista..
Saludos desde ecuador
-
Hola dannyman.
lo único que tienes que hacer es leerte este subforo
y te dará toda la información necesaria para tu aplicación:
http://miarroba.com/foros/ver.php?foroid=64652&temaid=172512
Espero te sirva.
Saludos. ![Divertido Divertido]()
![Divertido Divertido]()
-
hOLA NECHEVEL primero gracias por preocuparte en mi pregunta ya lei el subforo que me recomendaste pero nadie habla de los niveles de voltaje que maneja el puerto serial, como te dije ma nejo niveles TTL 0 y 5 voltios...
Mi aplicacion en visual recibe los datos pero siempre me devuelve 0 y nunca un 1, no se si el puerto serial maneje otros niveles de voltaje o cual es mi problem.. ayudame por fis es que ya estoy una semana sin avanzar en mi proyecto y no se que ya hacer....
Una vez mas gracias y perdon por responder antes pero se cayo el proveedor de internet dos dias pero ya estoy otra vez en la red..
Saludos desde ecuador
-
Hola una vez mas.. ya he avanzado con lo del diseño ya me consegui el max 232 ya lo adapte a mi circuito y ya me manda los niveles del voltaje requeridos 8voltios para 1 y -8 voltios para 0..
Pero no puedo leer todavia la secuencia de bits ya que siempre mi programa lee una secuencia 00000000. cuando en realidad me tendria que mandar algo como 01010101 o 11111010 me su pongo que esta mal cierto....???
Bueno en resumen mi programa usa el mscomm de vb6.. la propiedad inputmode a 1 para recibir en binario.. me imagino que si estoy recibiendo por que se activa el oncomm,y
variable=mscomm.input
es una variabletipo byte
en variable caracteres raros que me imagino que son ascii, los paso a decimal con
for x=1 to 8 do
variabe2=mid(variable,x,1)
variable2=asc(variable2)
next i
y siemprre me devuelve 0 0 0 0 0 en variable 2.
Por favor quisiera que me ayudaran diciendome que puede estar mal o si tengo que usar otro tipo de variables o el inputmode a 0... ya que el tiempo del proyecto de mi fin de carrera se acaba....
les juro que les voy a agradecer infinitamente
-
estas configurando la transmision de igual forma en tanto en la pc como en tu circuito??
me refiero al baudrate, paridad, etc.
-
Primero que todo gracias golden por responder y espero que me sigas ayudando..En lo que se refiere al baudrate no te lo sabria decir.. mi circuito manda un bit 0(8volt) o 1(-8volt) cada 1 segundo.. En el mscomm de visual lo pongo a 9600,n,8,1.. Cambie la variable a una tipo string Lo que me esta dando como resultado en la var o 255 o 0 pero no me da el resultado que mando...
Alguien me podria decir que es lo que me tendria que salir si mando por ejemplo una secuencia 00010111 me deberia un y solo un caracter ascii del byte??? o me debe dar 8 caracteres......
Al hacerle correr paso por paso a mi program en la variable=mscomm1.input
tengo un caracter cuadrado que al hacer asc(variable) me da 0.. o me da el caracter ? que me da como resultado 63 o un caracter que me da 255 o sino una secuencia de estos tres caracteres... es por esto que solo tendo o 0 o 63 o 255 como respuesta... esto repito almacenando en una variable tipo string porque usando una byte siempre me da 0... No se si me puedas ayudar diciendo que tipo de variable tengo que ocupar y como ocupar para almacenar y operar con los datos que me ingresan del puerto...
Ah otra cosa tengo que usar algun otro pin ademas del pin de recepcion y tierra del puerto para recibir datos... ya que solo esos pines uso....
Por favor necesito una mano.. no perdon en realidad necesito unas cien manos para poder darme cuenta que es ta mal... De antemano gracias por la ayuda...
-
DannyMan he estado esperimentando un poco con el manejo de torniquetes o molinetes yo manejo Vb pero no domino lo referente a pic. Te envío algunas lineas de codigo pruebalas en tu aplicativo, debes tener en la forma un control mscom y un timer. Analiza un poco el codigo y ubicalo.
espero te sirva.
Trate de enviar un adjunto, pero da error
________________________Controla el puerto y la DataY LA DATA
Dim Good_Tx As Long
Dim Bad_Tx As Long
Dim Str_Index As Long
Dim Data_Val(10) As Integer
Dim Data_Str(10) As String
"_______________________________Son variables Modulares________________________________
Private Sub Tmr_Get_Data_Timer()
Dim Counter As Byte
Dim Temp_Data As String
Dim i As Integer
Dim e As Long
Const Data_Pts As Integer = 3
Dim BOF_Found As Boolean
Dim Good_Data As Boolean
Dim Bytes As String
Dim Data_Size_Bar_Val As Integer
Dim Err_Pct As Single
If MSComm_RS232.InBufferCount > 0 Then
Bytes = MSComm_RS232.Input
Out Puerto, 253
For e = 1 To 10000000
Next
Out Puerto, 255
Data_Size_Bar_Val = Len(Bytes)
BOF_Found = False
Good_Data = False
Str_Index = 0
Do
Temp_Data = GetDelimitedText(Bytes, ":", ":", Str_Index)
If Temp_Data = "BOF" Then
BOF_Found = True
Counter = 0
Do
Data_Str(Counter) = GetDelimitedText(Bytes, ":", ":", Str_Index)
Counter = Counter + 1
Loop Until Counter > Data_Pts Or Str_Index = 0
If Data_Str(Counter - 1) <> "EOF" Then
"Label_tx_status.Caption = "Failed, no EOF"
Bad_Tx = Bad_Tx + 1
"List_Diagnostics_EOF.AddItem Bytes
Else
"Label_tx_status.Caption = "Good "
Good_Tx = Good_Tx + 1
For i = 0 To Data_Pts - 1
"Data_Val(i) = Val(Data_Str(i))
"Data(i).Caption = Data_Str(i)
Next i
Good_Data = True
End If
End If
Loop Until Str_Index = 0 Or Good_Data = True
If BOF_Found = False Then
"Label_tx_status.Caption = "Failed, no BOF"
Bad_Tx = Bad_Tx + 1
"List_Diagnostics_BOF.AddItem Bytes
End If
If Good_Tx > 2147483600 Or Bad_Tx > 2147483600 Then " long = 2,147,483,648
Good_Tx = Int(Good_Tx / 2)
Bad_Tx = Int(Bad_Tx / 2)
End If
If Bad_Tx + Good_Tx > 0 Then
Err_Pct = Good_Tx / (Bad_Tx + Good_Tx) * 100
"Label_good_Tx_percent.Caption = Val(Format$(Err_Pct, "###"
) & " %"
Else
"Label_good_Tx_percent.Caption = "---%"
End If
"Label_good_tx.Caption = Val(Good_Tx)
"Label_bad_Tx.Caption = Val(Bad_Tx)
End If
End Sub
Private Sub trm_Data_Interval_chg()
Tmr_Get_Data.Interval = Val(420)
Bad_Tx = 0
Good_Tx = 0
End Sub
Function GetDelimitedText(Text As String, OpenDelimiter As String, _
CloseDelimiter As String, Str_Index As Long) As String
" get the text enclosed between two Delimiters
"
" it advances Index after the close delimiter
" Returns "" and Index = 0 if not found
" search is case insensitive
Dim i As Long, j As Long
If Str_Index = 0 Then Str_Index = 1
" search the opening mark
i = InStr(Str_Index, Text, OpenDelimiter, vbTextCompare)
If i = 0 Then
Str_Index = 0
Exit Function
End If
i = i + Len(OpenDelimiter)
" search the closing mark
j = InStr(i + 1, Text, CloseDelimiter, vbTextCompare)
If j = 0 Then
Str_Index = 0
Exit Function
End If
" get the text between the two Delimiters
GetDelimitedText = Mid$(Text, i, j - i)
" advanced the index after the closing Delimiter
Str_Index = j + Len(CloseDelimiter) - 1
End Function
"_____________esto va en un modulo Module1...
Declare Sub Out Lib "inpout32.Dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
-
pues creo q este es tu problema "1 bit 0(8volt) o 1(-8volt) cada 1 segundo.. "
Si tienes el mscomm configurado a una velocidad de 9600 bit por segundo, nunca lograras establecer la comunicacion.
Te recomiendo q estudies un poco el protocolo rs 232, y eventualmente, q consideres usar el puerto paralelo para tu aplicacion (si es q estas corto con el tiempo)
Q Pic estas usando para hacer la trasmision??? (si es q lo haces. pq de hecho en ningun momento lo mensionaste)
En este link hay rutinas de comunicacion rs232 de bajo nivel, con este codigo empece a experimentar con las comunicaciones seriales, me fue muy ultil.
http://www.todopic.com.ar/asm/RS232/txrxasin.txt
Otro detalle, la propiedad input, si estas usando la configuracion por defecto del mscomm, te devuelve datos q deverias almacenar en una variable tipo string. Y recurda q estaras recibiendo cracteres ascci, si quieres recuperar el valor binario
equivalente al q envia tu circuito, tienes q tratar estos datos para convertirlos a tal formato una vez recivbidos.
Por otro lado, parece q tus necesidades de comunicacion son basicas.. se me ocurre q podrias hacer un protocolo de comunicacion sencillo, y en lugar de usar el pin RX del puerto, Conectas con el CTS y lees el puerto cada cierto intervalo (1 seg?) para chequear los bits q entran. O incluso puedes hacer una comunicacion sincronica aprovechando el DTR.
-
Hola.. Sabes que he estado un poquitin ocupado por el tema de las practicas y arreglo de papeles.. pero veo que tu no te has despreocupado de mi problem y no me cansare de darte las gracias por ello...
El codigo que me enviaste no lo entiendo muy bien en la noche lo voy a pasar al visual para ahi entenderlo.. Con lo que respecta por que no uso el puerto serial te voy a comentar que mi proyecto consiste en un diseño de la mejor manera de controlar el acceso a un parqueadero.. para lo cual tengo que presentar la comunicacion via puerto paralelo y serial.. la parte del paralelo ya me funciono muy bien pero este puerto serial si ha tenido sus cosas raras que no me imagine..
No estoy usando ningun pic sino que el codigo es ingresado "por el cliente" mediante un teclado bueno.. lo que pasa es que al final tenia niveles de voltaje ttl 5v y 0v los que me funcionaron muy bien en el puerto paralelo.. para el serial tuve que añadir un max232 al circuito para adaptar los niveles de voltage.. Como te dije estos niveles son 8v y -8v cada 1 segundo ya que tiene que esperar que el usuario pulse end para enviar el codigo (esto si es así, ya que he medido con multimetro en el puerto y los niveles de voltaje ingresan cada un segundo).. He leido y probado varios codigos de los foros pero al igual que mi prog.. no me ha funcionado.. Espero que esta explicacion te aya sido clara y puedas ayudarme
Lo que quisiera es en una variable (no se de que tipo) tener los 8 bits que ingresan para pasarle a decimal.. mas claro quisiera tener el numero decimal de la secuencia ingresada..
Saludos... espero tu respuesta![Idea Idea]()
-
A por cierto randux me parece que tu necesitabas activar un torniquete con el puerto serial... como te fue lo conseguiste... Oye una pregunta los niveles de voltaje en el serial como los conseguiste por que recuerdo que tu trabajabas con mi mismos niveles de voltaje Rs-232
Saludos....
-
mmnnm pues creo q tienes un serio problema...
Hay ciertos tiempos q respetar en una comuniacion serial (mas en tu caso q elegiste asincronica)
vas a necesitar un pic para poder gestionar el envio de datos. no se me ocurre ninguna otra alternativa; a menos q quieras liarte con un regitro de desplazamiento y un reloj a una freq de 9,6 khz.... (alguien probo hacer esto??? me suena bastante interesante para terminar de comprender el protocolo rs232 jaja
)
para tratar los datos luego puedes usar la funcion Asc que "Devuelve un tipo Integer que representa el código de carácter correspondiente a la primera letra de una cadena." La cadena q te entrega la propiedad input...
Pero insisto, te recomiendo q estudies un poco el protocolo rs 232...
-
En una parte de mi circuita multiplexo los datos lo hago ayudado de un multiplexor y un contador para el cual ocupo un reloj de un segundo... Es por esto que al final de multiplexar tengo un bit cada un segundo... Si el problema es el reloj lo podria hacer de menos o de mas tu dime...
Ah otra cosa sabes que como todos estos dias he estado haciendo y haciendo pruebas le puse la config del puerto en 1200,n,8,1... y ya me empezo a recibir datos en mi variable tipo byte los mismos que los paso con la func asc() y tengo un decimal.. el problema es que solo me funciona cuando al pasar los 8 seg que empieza a mandar el primer bit mi circuito le corto la alimentacion es por esto que si me paso al menos un poco o me apresuro en cortar la alimentacion me da otro caracter y por ende otro decimal.. He pensado ocupar un bit del puerto paralelo para enviar desde ahi 5v o 0v de alimentacion del max232.. y asi cortar la alimentacion.. tu que me aconsejas ........
-
Dannyman como estas me alegra ver que haz avanzado con tu proyecto.
Bueno en referencia a si logre activar el rele del torniquete, esto lo estoy haciendo para el lugar donde trabajo y en realidad debo esperar a que aprueben dicho proyecto por lo que he dejado un poco las pruebas, sin embargo te cuento que sigo con la necesidad de activarlo, alguien me hablo del uso de transistores para ampliar el voltaje y que no solo este es el que dispara el rele sino que requiero de cierto amperaje, pero en realidad yo soy programador desdconozco de pic y transistores, me llama la atension el tema y siempre dedico tiepo a leer los comentarios de este, para mi el mejor foro de la red...
hermano si me puedes dar alguna pista de como llevar adelante este proyecto te lo agradeseré
Randux
-
Mira no recuerdo si estas usando el serie o el paralelo...
Si es por el puerto paralelo usa un rele de 5voltios (yo ya lo hice y no es complicado)...
El rele tiene 5 patitas... en un lado tres Que son en orden: Vcc(5volt), Entrada(mas bien lo que quieres que salga por la salida al disparar el rele) y Gnd... Mientras que las otras dos son Nc y No que son normalmente abierto y cerrado (las que van a ser las salidas)
No se bien lo que quieres hacer pero te comento lo que hice a ver si te ayuda.. Como al activar un pin de mi puerto paralelo o serial tengo cierta cantidad de volt de salida pero un bajo amperaje (no suficiente para activar el rele) lo que hice es conectar esta salida a una resistencia de 2.2Kohmios y de ahi a la base de un transistor cualquiera (yo use el 222) el emisor de este transistor conectalo a gnd, y el colector a la patilla de Gnd del rele... En la patilla de Vcc del rele conectas 5 voltios y en la entrada (la patilla del medio) pones el voltaje que necesite tu torniquete directamente, de la patilla nc te saldra este voltaje y podras activar el torniquete... esto siempre y cuando el puerto te mande por ejemplo 5voltios ya que si te manda 0 voltios (es decir cuando no quieras que se active el torniquete) el rele no estara polarizado y por ende no disparara...
Espero haberme hecho entender pero sino dime que no y te ayudo nos vemos y suerte....
-
Hola DannyMan, como estas?
Te comento que me he estado documentado con respecto a los pics y a una que otra cosita ademas de atender los comentarios que te han hecho los maestros colaboradores con respecto a tu proyecto.
Entiendo lo que me describes y mejor explicacion imposible, en cuanto a que puerto estoy usando pues he probado con los dos, paralelo y serial de hecho elaboré los cables yo mismo siguiendo un esquema que conseguí en la web y conecte unos leg y bueno por lo menos encienden. ahora bien tengo un rele de 12 voltios es el 743h-1c-c, 10A 12V ac, 10A 24V cd, pero conseguire esta semana uno de 5 voltios o de seis, lo otro es que no se si requiero colocar la resistencia de 2.2Kohmios y el transistor 222 a una placa o si esto lo puedo hacer directo, de esto si no tengo ni idea.
Gracias nuevamente DannyMan, realmente te estoy muy agradecido.
-
hola randux.. lo del rele de 5 voltios puedes encontrarlo en cualquier local de electronica, y te recomiendo este por con esto yo lo he probado y me ha funcionado perfectamente...
No entiendo mucho lo de si lo pones en una placa... me imagino que es una de circuito impreso??? sis es asi lo mejor seria primero que lo pruebes antes de soldarlo en la placa, a por cierto el transistor 222 tiene una cara redonda y la otra plana, si lo ves desde la cara redonda de izquierda a derecha tienes los pines colector,base, emisor.. Espero haberte ayudado lo que no entiendo es a que te refieres con lo pongo no lo pongo a la placa?????
Saludos desde Ecuador
-
Hola soy nuevo en el foro pero creo que puedo ayudar en algo, la verdad creo que seria mas facil si utilizaras un integrado que configurara tasa de baudios un pic serial muy util y sencillo en la pagina de www.todopic.com.ar hay muchos codigos de Tx y Rx utilizando la UART del pic con esto puedes configurar tu tasa de tx, ademas los pic son muy compatibles con perifericos como teclados matriciales y demas, bueno espero que te sirva e algo....
-
hola a todos de verdad los felicito en lo poco que he podido observar es una pagina muy buena
, por este motivo quisiera que me ayudaran. Veran yo soy suuuuper nueva en esto he trabajado en visual basic pero no con transmision de archivos
. Ahora me encuentro con un proyecto en el que tengo que encriptar archivos y luego pasarlos a otra computadora por puerto serial y por puerto paralelo y como comprenderan me siento en la nebulosa
ya hice la parte de encriptacion pero me falta el traspaso de esos archivo si alguien tendria algun codigo o página que me ayude se lo agradeceria eternamente
-
Hola
Puedes checar esta página, ahí te pueden ayudar con eso respecto a la parte de visual basic
www.vb-mundo.com
Saludos desde México
-
Hola foro, pues, respecto a la transmision de datos a traves del puerto serial tambien estoy en ceros, al menos con VB. Yo tambien lo utilizo en un proyecto que estoy realizando, utilizao un pic que recibe comandos del PC, y el pic le envia muestras a la PC, todo a traves del puerto serial..
Aqui en mi libreria de PIC tengo una rutina de transmision y recepcion serial a 9600 bits por segundo, sin paridad, si a alguien le sirve solo diganmelo y se los mando, aunque para eso estan otras secciones de este foro...
Mi pregunta es la siguiente: Yo necesito recibir datos binarios a traves del puerto serial con el VB, no caracteres ASCII, se que solo bastaria con transformarlos, pero tengo el problema de que no se exactamente que caracteres recibiria, ya que son muestras digitalizadas, y no se si eso me traeria inconvenientes con lo del caracter de retorno de carro y eso, por lo cual, al menos para mi aplicacion, me gustaria saber como se puede activar el puerto serial para recibir datos y que VB los almacene como binarios, para despues yo leerlos del buffer de recepcion.
Por el momento estoy utilizando Matlab, el me permite utilizar el puerto serial de una manera muy sencilla, justo como lo ocupo, pero me pregunto como maneja el VB el buffer de recepcion, por ejemplo, Matlab maneja el buffer de RX como un vector Columna, obvio poruqe para eso es Matlab, entonces quisiera saber como lo maneja VB para tener una mejor idea al migrar la aplicacion a VB.... gracias por todo foro..