Hola,
Primero que nada me presento.
Mi nombre es Delmo Gonzalez... dgg006 en Internet..
Estoy estudiando informática, y este año tenemos que entregar un proyecto.
Una pequeña parte del proyecto que elegimos, consta de un programa basico, que busque cambios continuamente en un TXT. y haga una accion segun el contenido.
Logré (con esfuerzo, porque no 100% novato en esto) escribir este codigo:
#include <stdio.h>
int main ()
{
int resul;
int estado=-1;
int infinito=0;
FILE *texto;
texto = fopen ("Cocina.txt","r");
fscanf (texto, "%d",&resul);
fclose (texto);
while (infinito == 0)
{
switch (resul)
{
case 0:
texto = fopen ("Cocina.txt","r");
fscanf (texto, "%d",&resul);
fclose (texto);
if (estado != 0)
{
system("cls");
printf ("Apagado");
}
estado=0;
break;
case 1:
texto = fopen ("Cocina.txt","r");
fscanf (texto, "%d",&resul);
fclose (texto);
if (estado != 1)
{
system("cls");
printf ("Encendido");
}
estado=1;
break;
}
}
}
En windows, funciona perfecto, pero la idea es hacerlo correr en linux server. Cuando lo compilo ahí, compila sin errores, pero NO HACE NADA!!
Queda en negro.
En que estoy fallando? Algo falta para que funcione en linux?
(los system("cls"), hay que cambiarlos por system("clear") para que funcione en linux)
Les comento lo que tiene que hacer este programa.
Lee dentro del TXT.
Si hay un 1, muestra Encendido.
Si hay un 0, muestra Apagado.
Todo dentro de un bucle infinito!!!
A futuro, en lugar de mostrar encendido o apagado, tiene que activar o desactivar un relay en el puerto paralelo, pero supongo que esos códigos irán luego dentro de este. Por algo se empieza.
Gracias y espero sus respuestas
usas system("cls")
y ese comando es unico de windows (creo), en linux creo que se puede usar "clear"
saludos
Gracias por la pronta respuesta, pero si te fijas, ya lo había aclarado, ese codigo tal como esta funciona en windows
Lo siento no habia leido la parte de abajo :xD
si te compila sin errores entonces ya no tengo ni idea :-\
una corazonada..... añade un salto de linea a los printf... es decir...
printf ("Apagado\n");
printf ("Encendido\n");
Cita de: dakomt en 28 Mayo 2011, 17:24 PM
una corazonada..... añade un salto de linea a los printf... es decir...
printf ("Apagado\n");
printf ("Encendido\n");
LITERALMENTE!!!
Me la quiero cortar!!
Podes creer que era eso!! WTF
No lo vi necesario, para que una nueva linea si antes borro la pantalla.
Un millón de gracias!!
Ahora solo me falta incluirle a este código los comandos para controlar el paralelo.
Ya me verán preguntando por ak :P
Otra ves gracias!
me alegro :xD
Suerte con el proyecto!
PD: Un consejo! Si vas a tener una parte monitorizando constantemente el fichero (lectura) y vas a tener alguna otra que escriba en el fichero,tal vez deberias considerar la posibilidad de tratarlo como un recurso compartido y controlar el acceso al mismo mediante cerrojos. Pero bueno ya dependera exactamente de como tengas planteado el sistema... simplemente te lo comento por si acaso :D
Me interesa TOTALMENTE lo que me decís.
He tenido errores en ocasiones.
Quien escribe ese TXT en una pagina en PHP, y claro, si tenes la mala suerte de clickear en el momento de la lectura del programa en C, me tira un error.
Podes explicarme como lo soluciono?
Mmmm seguramente habra muchas formas de solucionar eso... unas mas elegantes que otras...
Si la página PHP y el programa en C residen en la misma máquina tal vez podrías usar la creación de un archivo temporal y la comprobación de que éste ya exista para implementar un cerrojo... es decir:
1. Mientras exista el fichero 'cerrojo.tmp'--> me quedo esperando
2. (ya no existe el fichero 'cerrojo.tmp' --> lo creo
2.1 si no he podido crearlo vuelvo a 1 para comprobar si el otro programa lo ha creado antes que yo
3. realizo el acceso al fichero Cocina.txt (el programa PHP para escribir , en el caso del C para leer)
4. Elimino el fichero 'cerrojo.tmp'
El codigo de ambos programas seria algo parecido a los puntos anteriores.
No obstante no creo que sea muy eficiente/elegante esta solución... Otra posibilidad tal vez... es convertir el programa en C en un cgi-bin que seria invocado por la pagina PHP cuando hubiera un cambio de estado y de esta forma no seria necesario estar continuamente monitorizando el estado del fichero Cocina.txt. Pero nuevamente es solo una idea más.. tampoco se como tienes planteado la globalidad del sistema.
Saludos!
Lo que se me habia ocurrido, pero no he tenido tiempo de ponerme a pensar como hacerlo, es desde el PHP.
Osea,
1) Trato de escribir en Cocina.txt
2) Si NO puedo escribir en Cocina.txt (porque esta ocupado)
3) Reintento
Si eso esta dentro d un bucle, no tendria porque mostrar error, y en algún momento lo va a lograr.... Tengo que ver como se hace..
Ya que estamos, quería hacer otra pregunta,
En el paralelo, va a haber 3 o 4 cosas conectadas, como hago para "activar" de a una individualmente???
Todavía no he buscado demasiado del tema, pero por lo que he visto, mandan la orden en binario a todos los puertos.
Ejemplo:
Cocina: "Encendida"
Habitación: "Apagada"
Baño: "Encendido"
Si con este programa solo quiero prender o apagar la Cocina, como hago para que los demás queden como están?
Espero haberme explicado :S
Bueno... si solo tienes un programa que escribe y otro que lee... y los valores son siempre 0 o 1 es posible que aqui no se den condiciones de carrera y no tengas que liarte con cerrojos y demás. Prueba tal como comentas y a ver si te funciona :-D
A lo segundo me temo que ya no puedo ayudarte xD no estoy puesto en la domótica jaja pero vamos en google seguro que hay mucha informacion y ejemplos al respecto. Investiga! ;D