Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Javilondo

#1
Hola amigos estoy haciendo un circuito para un reloj mecánico controlado por un Raspberry Pi con Debian.
Hay un script llamado encoders.sh que lee la posición de las manecillas del reloj a través de unos encoders conectados al GPIO, luego la escribe en dos archivos: "/var/www/vars/hora_caratula/hora" y "/var/www/vars/hora_caratula/minuto" respectivamente.
Hasta ahí todo va bien, pero estoy atorado con un segundo script llamado sincro.sh, lo que se supone que tiene que hacer es interpretar los valores de los archivos antes mencionados y compararlos con la hora del sistema, de manera que se pueda calcular si la carátula del reloj tiene algún retraso o adelanto, para posteriormente sincronizar las manecillas con la hora del sistema.

El valor de los archivos es hora=5 y minuto=0, así quedaron después de la última lectura de los encoders.

Este es el código:

#! /bin/bash
# sincro.sh

# Carga valores de hora en carátula
cHor=$(cat /var/www/vars/hora_caratula/hora)
cMin=$(cat /var/www/vars/hora_caratula/minuto)
# Carga valores de hora del sistema
sHor=$(date +%I)
sMin=$(date +%M)
# Filtra cadenas
sHor=${sHor/#0/} # Extrae el primer cero, si lo hubiese, ej: 08 --> 8
sMin=${sMin/#0/} # Extrae el primer cero, si lo hubiese, ej: 08 --> 8
sHor=${sHor/12/0} # Sustituye el 12 por 0.

# Calcula minutos transcurridos en carátula
minCar=$[$cHor * 60 + $cMin ]
# Calcula minutos trasncurridos en sistema
minSis=$[$sHor * 60 + $sMin ]
# Calcula la diferencia de minutos transcurridos
minDif=$[$minCar - $minSis ]

# Muestra la Horade la carátula y la hora del sistema:
echo "Hora Carátula: $cHor:$cMin | Minutos: $minCar"
echo "Hora Sistema: $sHor:$sMin | Minutos: $minSis"

# Muestra la diferencia de minutos entre ambas horas.
# Si la diferencia es negativa se aplica valor absoluto:
if [[ minDif -lt 0 ]]
then echo "Diferencia: Atrasado con $[$minDif * -1] minutos"
else echo "Diferencia: Adelantado con $minDif minutos"
fi

El problema es que cuando ejecuto el script me arroja este error:
root@raspberrypi:~# ./sincro.sh
")60 + 0sintáctico: operador aritmético inválido (el elemento de error es "
| Minutos: a: 5
Hora Sistema: 5:53 | Minutos: 353
Diferencia: Atrasado con 353 minutos


Lo extraño es que cuando introduzco valores artificiales como asignación de las dos primeras variables en vez de asignar el valor de los archivos entonces el script se ejecuta correctamente y sin errores.
Aquí está el segmento que modifiqué:

#! /bin/bash
# sincro.sh

#cHor=$(cat /var/www/vars/hora_caratula/hora)
cHor=5
#cMin=$(cat /var/www/vars/hora_caratula/minuto)
cMin=0
...

Y su respectiva salida:

root@raspberrypi:~# ./sincro.sh
Hora Carátula: 5:0 | Minutos: 300
Hora Sistema: 6:9 | Minutos: 369
Diferencia: Atrasado con 69 minutos


No comprendo porqué el error emerge cuando cargo los valores desde los archivos, así que para descartar un error de lectura elaboré otro script llamado ajuste.sh con el siguiente código:

#! /bin/bash
# ajuste.sh

./sincro.sh $(cat /var/www/vars/hora_caratula/hora) $(cat /var/www/vars/hora_caratula/minuto)

Como verán ahora estoy leyendo los mismos archivos desde el script ajuste.sh e inyectándolos como parámetros al script sincro.sh, para esto tuve que retocar un poco el código de sincro.sh para que pueda recibir dichos parámetros, quedó así:
#! /bin/bash
# sincro.sh

# Carga valores de hora en carátula
#cHor=$(cat /var/www/vars/hora_caratula/hora)
cHor=$1
#cMin=$(cat /var/www/vars/hora_caratula/minuto)
cMin=$2
...

Y la salida que me dió es:
root@raspberrypi:~# ./ajuste.sh
")60 + 0sintáctico: operador aritmético inválido (el elemento de error es "
| Minutos: a: 5
Hora Sistema: 6:25 | Minutos: 385
Diferencia: Atrasado con 385 minutos

Otra vez con los errores de sintaxis aun pasando los valores como parámetros, pero se me ocurrió modificar un poco el script de ajuste.sh de manera que enviase valores artificiales en ves de leer los archivos, lo mismo que hice anteriormente en el script sincro.sh solo que ahora sería a través de parámetros desde el script ajuste.sh
La modificación fue comentar las asignaciones de los archivos y sustituirlos con valores artificiales '5' y '0'. He aquí el código:
#! /bin/bash
# ajuste.sh

./sincro.sh 5 0 #$(cat /var/www/vars/hora_caratula/hora) $(cat /var/www/vars/hora_caratula/minuto)

Y su respectiva salida:
root@raspberrypi:~# ./ajuste.sh
Hora Carátula: 5:0 | Minutos: 300
Hora Sistema: 6:34 | Minutos: 394
Diferencia: Atrasado con 94 minutos

La salida no tiene errores como cuando introduje los valores artificiales en el script original (sin parámetros).
Como pueden ver, aparece un patrón, este es que cuando asigno los valores desde los archivos ya sea desde el script original através de parámetros aparece el "error de sintaxis" y cuando asigno valores artificiales ya sea en el script original como atraves de parámetros, la salida está libre de errores.

Notarán que para los valores de asignación usé siempre los mismos valores que contenían los archivos desde la última lectura de los encoders ('5' y '0'), esto lo hice para evitar un sesgo, o sea que el código trate siempre con los mismos valores y solo cambie la situación del flujo de código de la "hora de la carátula". También se podrán dar cuenta que los valores de la "hora del sistema" han ido cambiando en cada ejecución, esto es natural, puesto que estos valores realmente son extraídos de la hora del sistema que está en avance constante, pero a pesar de eso nunca presentó anomalías, quiere decir que el problema está en la sección de asignación de valores de la "hora de la carátula" y sólo cuando dicha asignación era procedente de la lectura de los archivos.
Dudo que sea un problema de lectura porque estoy como root, además sistema de ficheros no está corrupto.
Cuando las pruebas fueron efectuadas los permisos de dichos archivos estaban en 755, posteriormente los cambié a 777 y repetí las pruebas pero todo sigue igual.
Para descartar definitivamente errores de lectura escribí otro script llamado valores.sh que simplemente muestra el contenido de los archivos:
#! /bin/bash
# valores.sh

echo "Hora: $(cat /var/www/vars/hora_caratula/hora)"
echo "Minuto: $(cat /var/www/vars/hora_caratula/minuto)"

Dando la siguiente salida:
root@raspberrypi:~# ./valores.sh
Hora: 5
Minuto: 0

El script pudo leer y mostrar sin problemas el contenido de los archivos, así que me consta que no hay error de lectura.
Tal vez el problema no es tan grande, tal vez sea un error obvio de novato que está justo frente a mi, pero no logro verlo.

Si alguien encuentra el dichoso error de sintaxis agradecería que lo compartiera, es posible que yo no sea el único que pase por esto.
Saludos
#2
Programación Visual Basic / Re: Variables tipo objeto
22 Septiembre 2010, 09:19 AM
GRACIAS

Todo marcha a toda máquina.

Aprendí varias cosas como:

  • El uso de ByRef (creo que a eso se refería ignorantev1.1 con lo de pasar el apuntador por parámetro, aunque un puntero indica literalmente la posición de memoria de su identificador mientras que una referencia lo hace de manera abstracta).
  • El uso de Set para copiar o asignar un objeto.
  • La implementación de hDC para pintar como dices: donde te de tu regalada gana(BlackZeroX que grán código).
#3
Programación Visual Basic / Re: Variables tipo objeto
22 Septiembre 2010, 08:41 AM
¿para estas APIs es necesario tener .NET?
#4
Programación Visual Basic / Re: Variables tipo objeto
22 Septiembre 2010, 08:38 AM
Muchas Gracias Miguel Ángel
si no te contestaba es porque estoy tardando en digerir toda la información.
Ya me dejaste mucha tarea.
Publicaré los resultados.
#5
Programación Visual Basic / Re: Variables tipo objeto
22 Septiembre 2010, 06:42 AM
Cita de: BlackZeroX en 22 Septiembre 2010, 06:33 AM
.
Trabaja con un DC... es mas General asi puedes pintar en DONDE SE TE DE LA REGALADA GANA.
Dulces Lunas!¡.

Gracias por responder.
Tengo una duda: ¿ que es un DC?
¿Hay manera de hacerlo sin invocar APIs? (no estoy en contra de las apis, pero creo que un código sobrio puede llegar a superar a una llamada al sistema)
#6
Programación Visual Basic / Re: Variables tipo objeto
22 Septiembre 2010, 06:35 AM
Cita de: ignorantev1.1 en 22 Septiembre 2010, 04:19 AM
Y por que no pasar el apuntador de "Picture1" como parametro a "funcion"?


  • ¿a que te refieres con pasar el apuntaddor?
  • De ser así ¿Que caso tendría si paso un picture1 como parámetro? si lo nececito como salida y que yo sepa los parámetros son de entrada (o tal vez estoy equivocado).
  • Además cómo si utilizo a Picture1 en la función cómo ésta será independiente de cada futuro formulario (necesito imparcialidad para cada formulario)

Disculpa si mis preguntas son atrevidas pero así es la ignorancia y deseo reducirla.
#7
Programación Visual Basic / Variables tipo objeto
21 Septiembre 2010, 21:43 PM
Hola amigos!

Estoy desarrollando un programa en el cual tengo un TextBox(TextBox1) un CommandButton(Command1) y un PictureBox(Picture1).
El objetivo es introducir en Text1 una lista de vectores y que al presionar Command1 sean graficados en Picture1.
Podría hacer que dentro de Command1 se ejecute el algoritmo de graficación, pero necesito declarar una función que haga esto y llamarla desde el Command1 porque posteriormente utilizaré la misma función desde varios formularios y me desharé del Text1 ya que incluiré la opción de leer archivos.vec donde se almacenaran los vectores.
No quiero que la función antes mencionada actue sobre el Picture1, sino que trabaje con otro objeto tipo PictureBox. Entonces se me ocurrió que podría declarar esta función como un objeto PictureBox y retornar el resultado del proceso mediante la invocación de la función en una asignación. Ejemplo:
Código (vb) [Seleccionar]

Private Sub Command1_Click()
    Picture1 = funcion(Text1)
End Sub
Private Function funcion(parametro string) As PictureBox

    'Codigo de interpretacion de vectores (tokenizer)
    'Bla, bla, bla, etc.

    'Codigo de graficado de vectores
    'ejemplo hipotetico de un vector graficado con el metodo line sobre la misma funcion:
    funcion.Line (50, 40)-(100, 150), vbRed
    'De esta manera la funcion devuelve el resultado en forma de un objeto tipo PictureBox

End Function

El código que interpreta los vectores ya lo tengo resuelto con un tokenizer que separa el string entrante en un array multidimensional tipo long.
Declaré una función tipo objeto (PictureBox) que tiene un parámetro(string) por donde ingresa la lista de vectores para que posterirmente sean procesados individualmente y que los grafique en la función de tipo PictureBox. En teoria el código me parecía correcto, pero en la práctica me sale un error:
Error '91' en tiempo de ejecucuón :
Variable de tipo Object o la variable del bloque With no está establecida

Nunca me había pasado esto antes con una función, pero el hecho es que es la primera vez que declaro una función como una variable de tipo objeto y no se que pueda estar mal.
Para descartar que fuese un error al declarar la función elaboré un nuevo programa pero ésta vez sólo con un PictureBox(Picture1) y un CommandButton(Command1).
Declaré una variable de nombre pic y como tipo PictureBox para trabajar con ella y posteriormente asignarla a Picture1. En el código puse lo siguiente:
Código (vb) [Seleccionar]

Dim pic As PictureBox

Private Sub Command1_Click()
    pic.BackColor = vbRed 'Esta vez cambie el metodo para descartar que fuera un error de sintaxis del metodo anterior
    Picture1 = pic
End Sub

Ejecuté el programa y al presionar Command1... ¡Crash! volvió a salir el mismo error. fue cuando me di cuenta de que no era ni un error de declaración de función ni de sintaxis del método line, entonces deduje que es un error de asignación ó declaración de variables tipo Object (Tal como aparecía en el error emergente).

¿Alguien sabe en qué estoy mal, o si estoy omitiendo algo obvio?
Si alguien me puede ayudar le estaré muy agradecido y además quedará como referencia futura por si alguien llega a tener el mismo problema.

Gracias.

#8
Hola amigos.
Quisiera saber si existe una manera de averiguar en qué lenguaje fue programado un ejecutable, esque quiero modificar un *.exe tipo MSDOS y otro con GUI, pero no se cual descompilador usar para cada uno.
Les agradeceré cualquier ayuda.
#9
Hola amigos.

Necesito saber si hay una manera de hacer una búsqeda de cuántos puertos seriales existen en una computadora, me refiero a un método que me haga saber el número de ellos para que con ése número se redimensione un LisBox con los puertos existentes numerados, esto es para que se pueda elegir el puerto a manejar.
He buscado información acerca de esto pero sólo me encuentro con esto: MSComm.CommPort = n siendo "n" el número del puerto a manejar, que no es lo que necesito.

Agradezco la ayuda para quien deseé brindármela.
#10
Muchas gracias robbie110487!!!  :D
Tu respuesta me ayudó muchísimo ya logré lo que nececitaba gracias a tu cooperación. :xD

Saludos.
Que estés bien! ::)