el 02-23-2011 07:03 PM
Mi problema es el siguiente:
quiero adquirir datos enviados mediante un dsPic por la puerta serial,de hecho lo hago y por un tiempo no hay problemas, pero cada cierto rato labview me envia un error(archivo adjunto).
Tengo sospechas que puede ser por el tiempo en que envio mis datos, pero lo he intentado con varias y diferentes formas,tengo entendido que dentro del loop while hay que si o si poner un "tiempo de ejecucion", como van a ver en el programa ese tiempo es de 1 seg, y al dspic lo he configurado para que me envie la trama cada 1/2 segundo....No se exactamente si eso esta bien puesto que he dejado los tiempos iguales y el error viene con mas frecuencia.
Se me ocurre tambien que que la trama que envio quizas se descordine con el labview y quizas cuando deba leer un numero quizas lea un espacio en blanco o un punto
la trama la envio de la siguiente forma dentro del dspic:
printf("%f %f %f %f %f %f",enviar1,enviar2,enviar3,enviar4,enviar5,enviar6);
Existe alguna forma de coordinar el labview con el dspic para que no se equivoque??, quizas haya que poner un identificador dentro del bloque de escaneo para que haga correctamente la leectura??(si es asi por favor alguien me puede decir como se hace)
O quizas no sea nada de lo que dije anteriormente y sea otro error
No se me ocurre que hacer por favor ayuda
Saludos al foro!!:)
02-25-2011 08:49 AM - editado 02-25-2011 08:54 AM
Hola, en mi opinión puedes tener problemas igualmente en el pic y en el LV y deberías modificar ambos para que el sistema pueda funcionar para largo tiempo sin problemas. Ten en cuenta que usualmente no se usan dos eventos temporizados en sistemas distintos, ya que los relojes nunca van a ser iguales y terminas perdiendo el sync. En estos casos se usa un reloj solamente y el otro sistema debe sincronizarse col primero de otra manera.
En el pic podrías marcar una dimensión fija de caracteres enviados y añadir un carácter de terminación. O sea: dale una precisión definida a tus datos, así que no pueda pasar que algo genere una cadena incorrecta que el LV no va aconvertir bien. Podrías por ejemplo modificar tu código de la siguiente manera:
printf("%6.3f %6.3f %6.3f %6.3f %6.3f %6.3f\r",enviar1,enviar2,enviar3,enviar4,enviar5,enviar6);
De esta manera siempre tendrás una cadena de la misma longitud. No sé si el compilador del PIC puede manejar semejante cadena ya que no lo utilizamos: espero que sí. El "\r" el el retorno de carro (ASCII 13).
En el LV puedes imponer en la configuración del VISA que se use el retorno de carro para terminar leyendo. Le das un timeout largo (1.5 seg) de manera que siempre te quedas en el VISA Read hasta que recibas el terminador. Debes chequear el código del salida del Read para discriminar el timeout (Pic no envía: apagado u roto). Yo no puedo ver tu código ya que tengo instalado el LV 8.5, pero se peueden encontrar ejemplos de comunicación con el "termination character": deberías encontrar en tu PC el ejemplo "Advanced serial write and read" donde puedes ver cómo definir el termination character.
De esta manera puedes obtener un sistema más estable y que debería poder ir funcionando para largo tiempo sin problemas.
el 02-25-2011 03:26 PM
primero que nada gracias por responder he logrado darle cierta estabilidad al sistema, esto lo hice gracias a tu sugerencia y aparte le agregue un bloque llamado match true/ false string funtion, he logrado que funcione bien por mas menos 1 hora, mi idea es que no fallle!!!jajajaja o que sea estable por largos periodos de tiempo
lamentablemente igual falla, añadi el "\n" como termination char, y funciona bien pero como digo se detiene cada cierto tiempo....
como dices debe ser por la coordinacion entre el dspic y labview, la otra idea que se me ocurre es no ocupar el bloque scan from string, pero no se como adquirir y separar la cadena de otra forma.
Lamentablemente no puedo subir el vl en 8.5 porque tengo unas funciones que solo aparecen en el 2009(set dynamic data atribute), o quizas si se pueda pero no lo se hacer
alguna otra sugerencia??
muchas gracias por el tiempo que te das al responder:)
02-25-2011 04:01 PM - editado 02-25-2011 04:04 PM
Bueno, ¿has probado ver el mensaje que pasas al Scan from string cuando hay el error? Si pones un probe en aquel cable puedes averiguar que en cada lectura el mensaje sea correcto.
¿Puedes sacar una imagen del código y ponerlo aquí? Lo que puede interesar es la predisposición del puerto serial y el proceso de lectura.
el 02-25-2011 04:11 PM
no no lo he probado asi....
pero lo probe cuando salta el error le doy a stop y me y tengo un indicador de string que al quedar en stop me permite ver el error...
con esto me di cuenta que en algun momento la cadena no llega completamente o sea llegan por ejemplo 3 valores... nose porque ocurre esto
en estos momentos hago otra prueba enviando los datos por el dspic mas lentamente (1 seg)... no se si funcionara pero si salta el error te subo lo que me salio con el probe.
Vale y gracias:)
el 02-25-2011 04:28 PM
y como era de esperarse salto el error
le saque las cosas al vl para dejarlo en 8.5.
ahora un par de precisiones desde ahora mi cadena la envio desde el dspic de la sigte forma
printf("identificador_enviar%1.2f %1.2f %1.2f %1.2f %1.2f %1.2f\n",enviar1,enviar2,enviar3,enviar4,enviar5,enviar6);
para que?.. esto para poder ir distriminando y hacer la lectura solo cuando sea correcta y lo veras en el vl que subi
gracias nuevamente!!
el 02-27-2011 12:46 PM
Bueno, hay algunos puntos que corregir para que el còdigo funcione como quieres.
Antes que todo es necesario imponer el correcto termination character en el VISA Configure Serial Port ya que por defecto se asume el 0x0A o sea el '\n'. El '\r' corresponde al caràcter 13.
Secundariamente si mides cuàntos caracteres hay en el puerto inmediatamente después de enviar el pedido es muy fàcil que el nùmero sea incorrecto, ya que debes dejar que el PIC maneje el comando y envìe la respuesta. Pero esto ya no es necesario si lees hasta el terminador, por lo que he modificado al vi.
En el còdigo ademàs he modificado la interpretaciòn del mensaje para simplificarla. Creo que va a funcionar aunque no he podido testearlo.
el 02-27-2011 11:45 PM
Hola Pasmosodico,
he estado pensando un poco en tu vi y hay algunos detalles que no me quedan claros, en particular aquel botón "Calibrar" que has puesto en la pantalla.
Normalmente hay dos maneras de interactuar con dispositivos externos:
El caso 1 arriba es el más simple: casi no hay necesidad de coordinar el proceso de lectura con el de pedido puesto que si todo va bien el dispositivo siempre me va a contestar dentro de cierto tiempo. Si este es tu caso, todo el proceso de lectura debería estar dentro del case que evalúa el botón "Calibrar". Si el PCI no contesta debes considerar que esté roto u desconectado u apagado y decidir qué hacer (seguramente poner una advertencia en la pantalla para poen el usuario al tanto).
El caso 2 es un poco mas complicado, porque se debe considerar el momento en el que enviar el pedido al PCI para que esto esté listo para escuchar y contestar. Además, no veo en el código si esperas en este momento una contestación diferente.
Espero que estas consideraciones puedan ayudarte en completar a lo mejor tu programa.
el 03-01-2011 03:33 PM
primero que nada gracias por responder nuevamente, disculpa la demora de mi respuesta pero tuve problemas con el internet
probare el vl que subiste para ver como me va
sobre tu duda el boton "calibrar", bueno primero que nada el proyecto que realizo trata de emular a un datalogger donde las corrientes llegan(4-20)al dsPIC, y este ultimo las envia mediante puerto serial a labview, el boton "calibrar" es para que el "usuario", envie los datos al dsPIC, estos datos corresponderan a los valores maximo y minimos de cada sensor que en mi caso seran 6 la trama esta concadenada en labview cosa que el dsPIC las reciba almacene y procese de manera correcta.... bueno esa parte esta resuelta pero ahora estaba medio atascado con el problema que te comentaba probare tu solucion a ver si me resulta y luego contare
Muchas gracias
🙂