Newsgroup: it.comp.os.linux.development
Titolo: ioctl e TIOCM_CAR


 
http://www.winchester.cjb.net
a Debian GNU/Linux "Slink" is running on Linux 2.2.14
mv "\<ANY SPAM\>" /dev/null
P.S.: Never try the command "rm -rf /" by root

}
Ti consiglio di rivedere un po' la struttura del programma (nel caso questa
non sia una versione tagliata male)
comunque la open a me va bene cosi' come l'hai scritta se e' giusta la parte
del DEVICE_FILE ( io l'ho provata direttamente con /dev/ttyS1)
per quanto riguarda nota che pe accedere al device devi essere root (almeno
da me ioctl fallisce come utente e mi sembra pure giusto...)
se proprio non ti funziona dimmelo che ti mando quello che ho riscritto per
far funzionare il tuo...
Vi][oZ
-- 
Per rispondere togliere NONSCASSA da reply-to.

On 6 Apr 2000 14:59:02 GMT, Vi][oZ wrote:
č vero č colpa mia, ho omesso molto codice, comunque la fd_device č
globale, e DEVICE_FILE č di default proprio /dev/ttyS1,
ma anche da root non stampa i valori status e ioret, anche se nel main
ho messo open_device(); e poi check_device();
bo.



Se il codice non e' troppo lungo postalo cosi' uno ha la visione completa,
comunque scusa, ma almeno ti apre il device o no? da quello che hai scritto
mi sembrava di aver capito che ti dava problemi la open()...
ripeto se posti il codice completo guardo se ho tempo di dargli un'occhiata
PS: Ben lungi da me dare note di stile, ma secondo me la variabile globale
in questo caso e' da evitare (come del resto quando non e' strettamente
necessaria)
byebye
Vi][oZ
wq


On 6 Apr 2000 17:56:46 GMT, Vi][oZ wrote:
l'ho un po semplificato, cmq non funzia:
//#include "ncd.h"
#include <stdio.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <sys/time.h>
#include <errno.h>
int 
open_device(const char * device)
{
	int fd_device=open(device,00);
	if(fd_device < 0)
		exit(EXIT_FAILURE);
	return fd_device;
}
void	
check_device(int fd_device)
{
	int status;
	unsigned int ioret;
	for (;;)  
	{
		status = ioctl(fd_device, TIOCMGET, &ioret);
		if (status)   //se err, riparte
		{
			close(fd_device);
			open_device("/dev/modem");
			continue;
		}
		if(status == 0)
			printf("%d\t%d",status,ioret);
		sleep(1);
	}
}
int
main (int argc, char **argv)
{
	int a=open_device("/dev/modem");
	check_device(a);
	return (EXIT_SUCCESS);


On 6 Apr 2000 17:56:46 GMT, Vi][oZ wrote:
Andava quasi tutto bene tranne il fatto che non stampava xche' essendo
printf una funzione di output bufferizzato devi, se vuoi usarla usare 
fflush(stdout)
che in sostanza fa svuotare il buffer ad ogni giro
Per semplicita' riposto il codice corretto
/*INIZIO*/
#include <stdio.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <fcntl.h>
#include <string.h>
#include <sys/time.h>
#include <errno.h>
int 
open_device(const char * device)
        int fd_device=open(device,O_RDONLY);
        if(fd_device < 0)
                exit(EXIT_FAILURE);
        return fd_device;
void    
check_device(int fd_device)
        int status;
        unsigned int ioret;
        for (;;)  
        {
                status = ioctl(fd_device, TIOCMGET, &ioret);
                if (status)   
                {
                        close(fd_device);
                        open_device("/dev/modem");
                        continue;
                }
                if(status == 0){
                        printf("%d\t%d",status,ioret);
                        fflush(stdout);
                }
                sleep(1);
 
	}
}
 
int main(void){
 
	int a=open_device("/dev/ttyS1");
	check_device(a);
        return (EXIT_SUCCESS);
}
/*FINE**/
spero di averti aiutato
byebye
Vi][oZ


On 8 Apr 2000 18:55:12 GMT, Vi][oZ wrote:
grazie mille, ora funzia alla grande.
