Cable USB-Serial me envia mal los datos

Buenas tardes,

Mi primera consulta a este foro.

pues les comento que estoy haciendo un termometro con un pic 16f877a y el Lm35,

leo por ADC lo que arroja el Lm35, lo envio a un LCD y al mismo tiempo lo envio por puerto serial,
los datos los recibo con un programita que hice en Visual Basic, recibo 10 veces lo que lea el sensor, le saco el promedio y envio a la base de datos, fuinciona perfectamente todo el tiempo, el problema esta cuando lo quiero usar con mi portatil con un USB - serial (HL-340) marca Steren, el dispositivo hace conexion y envia datos pero los envia mal, es decir si normal mente recibo 10 veces la lectura del sensor de esta forma:

20 Promedio 23.2
21
22
23
22
22
24
25
26
27

con el usb recibo

20 Promedio 9.9
2
1
2
2
22
23
2
4
21

segun creo yo la problematica esta en que aveces me envia el valor completo y en otras veces me envia numero por numero, el sensor leyo 21 pero me envia 2 y luego 1, y esto me trae rompiendome la cabeza, no encuentro donde esta el problema, el cable USB-ser se instala solito cuando lo conectas, pero ya tambien busque el driver en internet y el resultado es el mismo, menciono nuevamente para que quede claro, con cables serial normales todo funciona bien, es el cable usb-serial el que me da problemas, pero no se si es ese cable en particular, no he probado con otro cable USb-ser, lo que si he probado es hacer lo mismo en otro ordenador y el resultado es el mismo.

debo hacer alguna otra cosa para usar el cable usb-ser?, en algun lugar de internet leei que para cables USB-Serial no era necesario el Max232 por lo que habia que quitarlo pero ya lo intente y no me funciono.

espero me puedan ayudar a resolverlo ya que para llevar este proyecto a la etapa final debo implementarlo en la laptop ya que donde lo voy a utilizar me es imposible poner un Desktop.

De anetmano Muchisimas Gracias!

Saludos desde Mexico.
 
Yo de nuevo, jeje todabia sin respuesta bueno pues realize un video para ejemplificar mi problematica, y ademas explicare la aplicacion que tendra este proyecyo,

comienzo por el video, como ya explique en este post, mi problema se presenta fisicamente (en el circuito REAL) si utilizo el cable USB-Serial, cuando utiliuzo un cable Serial normal en un Desktop, el aparato, el programa en VB.net y la base de datos funcionan Hermoso! :cool:

y bueno, se me ocurrio simular todo el proceso, con un COM Virtual en mi portatil y simular el envio de los datos con Microcode Stdio y Recibirlos con el programa en Vb tal como si yo fuera el pic, y mi sorpresa fue que el comportamiento fue el mismo..

tambien pase a la simulacion con Proteus, hice el circuito en proteus y puse a simular el Firmware del pic, y LO MISMO!, se presenta el mismo comportamiento, pero bueno veanlo ustedes mismos,

https://www.youtube.com/watch?v=dfIMiKKPFuo

cualquier cosa que no entiendan aqui estoy.

dejo aca la explicacion de para que es todo esto, por si a alguien le interesa.
Bueno, pues todo este rollo es para medir la tempertura de 2 Xbox 360, si tal cual lo leen, pienso meter un Xbox 360 en Aceite Minetal y otro al aire libre, y comprobar si en relaidad el aceite mineral me ayudara a evitar que se caliente, hay varias cosas que voy a considerar en este experimento.

la primera es ver que tanto amortigua el aceite el subidon de temperatura, pienso que en el aceite el xbox deberia tardar mas en llegar a su temperatura maxima, tambien voy a contemplar que tan rapido regresa el aceite a temperatura ambiente, para comprobar esto, es que necesito enviar la temperatura sensada a una base de datos, teniendo la temperatura en la base de datos las transferire a una grafia lineal y asi tendre el resultado del experimento.

Que tal, alguna recomendacion? alguien ya lo hizo? a alguien le interesa saber el resultado? aquien tambien quiere hacerlo? con gusto les ayudo, solo consulten.

Saludos y Gracias de antemano a quien me ayude a resolver mi problema con el Cable usb-serial
 
tiene toooodo el aspecto de que está mal el programa que recibe, es un fallo típico que los eventos se disparen "cuando quieren", ya no me acuerdo de como lo solucioné, creo que dejando el buffer de recepción a 1 y comprobando en cada byte si era un retorno de carro... ya no me acuerdo bien, lo siento.
 
pero como es que cuando utilizo un cable Serial normal el programa funciona a la perfeccion?, el mismo principio de este programa lo utilizo en otro que recibe codigos de barra PDF417 de los pedimentos aduanales de una pistolita, y funciona bien.

que sera? me buelvo loco, tambien pense que seria el Programa pero te digo, con el Serial normal funciona de maravilla, si pongo el codigo del programa serviria de algo?


saludos.
 
Es que ya no recuerdo como lo solucioné pero a mi me pasaba eso, a veces entraba la cadena entera y a veces se cortaba.
Me suena que lo que hacía era recuperar el contenido del buffer siempre que podía y lo recomponía en una variable o varias según si eran varias cadenas. Con eso ya me funcionó perfectamente con cualquier puerto serie que probé.
 
Buenas!, y pues si... BUENAS!, al final lo resolvi como me recomendaron, no queria hacerlo a la brava pero asi lo hice a final de cuentas, en el programa de Visual Basic, lo hice que validara lo recibia, es decir, siempre debe recibir "XX.XX" entonces cualquier cadena distinta de ese formato esta equivocada, lo realize ya con la simulacion virtual de Proteus y esta funcionando bien, lo llevare a la practica con el cable USB-serial y vere como va.

realmente no queria hacerlo en el programa, pero creo que era la unica solucion.

y bueno si a alguien le interesa el resultado de este experimento diga y con gusto comparto las graficas de temperatura.

ya les cuento como me fue con el cable USB-ser.

Saludos y Gracias a Scooter & 1024, nos leeremos pronto.
 
ya realize la prueba con el cable USB-Serial y el problema persistio, como ahora estoy validando los datos recividos, si los datos no coinciden los desecha y busca una lectura nueva y por tal motivo el programa me registra 1 de 10 lecturas, PFFFF!!!.... pues total me puse a ver que es lo que esta mandando el pic y Sorpresa!, me recive simbolos raros y algo de basura, como si estubiesen mal configurados los Baudios y no lo estan, salen cosas mas o menos asi

02."; 02.0" 22^0> 20±2"

y pues nanay, no se que hacer..... sera el Cable?

justo despues de probar el cable usb probe con Serial normal y Funciona de las mil maravillas, luego probe de nuevo con el USB y otra vez la misma problematica. y pues total no jala.

sospecho tambien de una cosa no se si tenga algo que ver, el cable USB-ser lo conecte al USB de la pc (Ovio) y el extremo serial a un DB9 Hembra, el cual tiene un cable como de 1 metro soldado, el cual pongo los extremos a las correspondiendtes salidas del MAX232 y a tierra, este cable mas el cable del usb me dan un total de 2 o 3 metros, cual es la distancia maxima que me puede aguantar el MAX232??, el max lo estoy alimentando con 5V, y no se si tambien tenga algo que ver, el circuito completo lo estoy alimentando con un cargador de Celular, de 5v, batalle mucho para hacer la lactura del LM35 estable por lo que le tuve que poner un capacitor de 470uf entre tierra y voltaje para que la lectura fuera mas estable, interferira este con el cable USB? repito con el Serial Funciona bien.

por que se me ocurre pensar que son los capacitores? por que cuando recien conecto el circuito al voltaje, me llegan bien 3 lecturas (a veces 2, a veces solo 1), y a partir de ahi muchos simbolos.

se les ocurre algo?
 
Última edición:
Longitud del cable menor a 5 metros, no debería haber problemas con la distancia. Pero depende del baud-rate utilizado, usa uno bajito (9600) y a ver que pasa.
La configuración del puerto serie tanto del lado de la PC como del PIC debería ser la misma, es recomendable 9600 bauds, sin paridad, sin control de flujo, 1 bit de stop. Si no funciona con eso entonces no va a funcionar con otras configuraciones.

El max232 está bien alimentado con 5V, habría que ver un esquemático del hardware para ver si están bien las conexiones (hay un capa que se conecta con el + a GND).

En principio trata de enviar un patrón conocido en vez de las mediciones de temperatura (A, B, C... o 1, 2, 3...) para aislar mejor el problema. De lo contrario uno no sabe si anda mal la comunicación con la PC, o se mete ruido al LM35 y falla la conversión AD, u otra cosa.
 
Mas que deshechar creo que tendrás que recomponer, a veces el evento no llega bien.
Si no recuerdo mal hay una opción de descargar todo el buffer, seguramente todos tus datos estén en él pero entrecortados.

Es decir, si compruebas la cadena y no está bien lee lo que quede en el buffer que seguramente será lo que te falta, o espera unos pocos ms y lee el buffer.
 
.... usa uno bajito (9600) y a ver que pasa......

.....hay un capa que se conecta con el + a GND.....

En principio trata de enviar un patrón conocido en vez de las mediciones de temperatura (A, B, C... o 1, 2, 3...) para aislar mejor el problema. De lo contrario uno no sabe si anda mal la comunicación con la PC, o se mete ruido al LM35 y falla la conversión AD, u otra cosa.

Gracias por sus respuestas, Ardogan, esa configuracion es la misma que tengo 9600 Baud, tanto en el pic como el PC, cuan seria el capacitor que va con el + a GND?, me lie un poco con el Datasheet respecto a la configuracion recomendada pero te comento que este mismo circuito nadamas cambiando el cable USB-ser por un cable Serial normal funciona perfecto, aun asi crees que sea el hardware?, tratare de enviar patrones mas sencillos para ver como va.

Mas que deshechar creo que tendrás que recomponer.....
Si no recuerdo mal hay una opción de descargar todo el buffer, seguramente todos tus datos estén en él pero entrecortados.

Es decir, si compruebas la cadena y no está bien lee lo que quede en el buffer que seguramente será lo que te falta, o espera unos pocos ms y lee el buffer.

Gracias Scooter, pues mira si estoy desechando el dato recibido, pero lo desecho despues de no haber podido componerlo, es decir la cadena debe contener 5 caracterer (cuatro numeros y un punto), si recibo menos de 5 caracteres digamos 2, guadro el dato en una variable y espero la proxima recepcion, si en la segunda recepcion llegan otros 2 caracteres ahora tengo cuatro, guardo los 4 y espero, si a la siguiente recibo mas de 1 caracter entoces el programa desecha, y el problema es que siempre llegan mas de 5 caracteres, pareciera que se le mete ruido al dato que recibe el pc por que de una sola lectura recibo mas de 5 caracteres, de cualquier forma, seguire el consejo de Ardogan y podre al pic a enviar un solo dato sencillo para intentar limpiar lo que recibo, si despues de unas horas no logro algo creo que optare por armarme una desktop :((n)(n)(n)...

Gracias por la ayuda, en cuanto tenga novedad regreso con noticias, incluso para comentarles cuanto me costo mi nuevo Desktop jajajaja:LOL: , y si a alguien se le ocurre otra cosa "SOY TODO OIDOS!.."
 
...............es decir la cadena debe contener 5 caracterer (cuatro numeros y un punto),

Hola, modifica esta parte de tu codigo de envio, que la cadena contenga 6 caracteres(cuatro numeros, un punto y agrega forsozamente el fin de cadena '\0'), ademas revisa que inicializas tus variables al declararlas en este caso la cadena de envio.
 
Pues is, otra opción es enviar cadenas tipo:
35,55**** en donde los asteriscos no sirvan de nada, podes dos o tres de regalo y luego los quitas, así tienes un "colchón" para los errores te quedas solo con el número y los decimales.
 
Si crees que el problema viene por el enlace físico:

- Usa tramas con verificación, ej. |Byte código| Byte dato1|.....|Byte datoN|Byte CheckSum|
- Baja la velocidad del enlace a lo mínimo indispensable.

Por el lado del soft, a mi varias veces me sucedió en Java que al querer mandar "Bytes" siempre a la a la larga tenía algún problemas, la única solución que le encontré fue trabajar directamente con streams de strings (código ascii).
 
Suele ser porque VB dispara mal los eventos no se muy bien cuando ni por qué. En general los microcontroladores solo llevan TX y RX y el resto habria que implementarlo por soft, además de que perderías pines. Para eso implementa el protocolo xon xoff, aunque insisto que rebuscando en el buffer los datos están, otra cosa es que estén cuando no toca.
 
Se que no es mucha solucion, pero a veces conviene probar el funcionamiento del cable y del max232... para probar el funcionamiento del cable, puentea la pata 2 con la 3 (tx con rx) y envia un dato desde la pc... deberias recibir exactamente lo mismo... Ahora, conecta el cable al max y puentea tx y rx del max y realiza la misma prueba, deberias recibir lo mismo que enviaste, si no es asi, hay un problema en el max o en el cable, depende donde haya saltado la falla

Espero ser de ayuda, hasta luego
 
Quizas tengan razon ambos. solo toco un nervio de lo que podria ser una solucion, para esas distancias yo creo una buena solucion seria cambiar a RS485
algo parecido a esto...

rs232-rs485_cable.gif


ojo que no lo revice bien pero me parece un buen ejemplo y con animo a que se entere que hay otras opciones.
 
Atrás
Arriba