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ú

Temas - 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 / 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.

#3
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.
#4
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.
#5
Hola de nuevo!

Necesito extraer el código ASCII de cada caracter de una cadena de caracteres en VB6.

Se que los caracteres se pueden extraer con la función Mid(Cadena,inicio,longitud), pero lo que no consigo es extraer a cada caracter el código ASCII.

Cabe mencionar que en VB6 no existe el tipo Char, por eso guardo los caracteres en matrices tipo String de x*n, siendo "x" la longitud de la cadena inicial y "n" la posición del caracter. En éste caso los caracteres no son propiamente caracteres, sino cadenas con longitud de 1.

Después de esto es fácil referenciar los caracteres, pero cómo le puedo hacer para convertir el caracter en su valor ASCII?

Lamentablemente los tutoriales de VB6 que he encontrado hasta ahora son muy pobres y poco documentados, es por eso que estoy considerando mudarme a VB.NET ya que es mas amplio, pero por el momento nececito lograr esto en VB6.

Si alguien me ayuda con esto le estaré muy agradecido.

Saludos!!!
#6
Hola amigos, lo que deseo hacer es dividir una cadena en un arreglo de caracteres.
Intenté usar el ejemplo siguiente ejemplo:
http://msdn.microsoft.com/es-es/library/ms233830(VS.80).aspx
pero cuando lo quiese compilar me salió el siguiente error el cual dice:
"Error de compilación: Se esperaba: Fin de la instrucción"  :huh:
Soy algo nuevo en visualbasic y estoy usando VB6.0 no se si es una incompatibilidad de versión.
Espero que me puedan orientar.
#7
Hola amigos!
Tengo un problema, espero me puedan ayudar:

Estoy haciendo un Batch que escribe unas claves en el registro de windows, éstas claves pertenecen al Kaspersky y el cambio sólo puede surtir efecto siempre y cuando el Kaspersky se encuentre cerrado, para eso me dispuse a añadirle a mi batch una sentencia que "supuestamente" se debería de encargar de cerrar el Kaspersky la cual es:
Taskkill /F /IM avp.exe

Pero sucede que me aparece esto:
ERROR: no se pudo terminar el proceso "avp.exe" con PID 1356.
Motivo: Acceso denegado.
ERROR: no se pudo terminar el proceso "avp.exe" con PID 1568.
Motivo: Acceso denegado.


Mi pregunta es:
¿Cómo puedo terminar con éste proceso que al parecer es "inmortal" o tiene acceso denegado y además es doble porque tiene un proceso como usuario y otro como sistema y por ende existen dos PID con el mismo nombre de imagen que es "avp.exe" los cuales son en mi caso: 1356 y 1568?