Newsgroup: it.comp.os.linux.development
Titolo: Domanda sulle seriali in linux

Salve a tutti,
premetto che è da poco che sviluppo in linux quindi scusate l'ignoranza, ma
ho un problema nella gestione di un modem gprs siemens mc35.
il software che devo sviluppare deve poter inviare al modem una serie di
comandi at (per vedere se c'è campo gsm, lo stato degli sms, etc) per fare
questo ho creato una classe che incapsula tutto il codice necessario,
apparentemente tutto funziona, ma in maniera completamente random!!!! Alcune
volte senza apparente motivo tutto funziona alla grande e non perdo un
carattere altre volte i dati vengono inviati ma non ricevo nulla indietro,
altre volte ricevo spazzatura, insomma un casino, per fare il setup della
porta utilizzo il codice seguente:
[cut]
fileDescriptor = open("/dev/ttyS0", O_RDWR | O_NDELAY);
[cut]
my_termios.c_cflag = B38400 | CREAD | CLOCAL | HUPCL;
my_termios.c_cflag &= ~PARENB;
my_termios.c_cflag &= ~CSTOPB;
my_termios.c_cflag &= ~CSIZE; /* Mask the character size bits */
my_termios.c_cflag |= CS8; /* Select 8 data bits */
my_termios.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
my_termios.c_iflag &= ~(IXON | IXOFF | IXANY);
my_termios.c_oflag &= ~OPOST;
cfsetospeed(&my_termios, B38400);
cfsetispeed(&my_termios, B38400);
[cut]
Questo dovrebbe settare la porta su 8 bit di dati, nessuna parità, nessun
controllo di flusso, e sistemare tutto per un modem (niente echo o altre
cose simili) o sbaglio?
Il software gira su uCLinux/coldfire, ah si piccola nota anche tip (che
dovrebbe essere fatto apposta per i modem) alcune volte non funziona, o
meglio lo avvio e si blocca, altre volte invece si avvia e funziona tutto
regolarmente, ho dato un'occhiata al codice ma non vedo grosse differenze
con il mio...
Avete qualche suggerimento o url?
Grazie.

 my_termios.c_cflag = B38400 | CREAD | CLOCAL | HUPCL;
                               ^^^^^
        perche' qui ? tanto dopo usi cfset*speed
comunque la cosa piu importante secondo me e' che manca
my_termios.c_cflag &= ~CRTSCTS; // controllo flusso hardware:no

 porta utilizzo il codice seguente:
sei sicuro che la spazzatura che ti arriva indietro non sia l'output del
telefono? Io ho svilupatto una cosa simile per gli ericsson, e ho visto
che quando arriva un sms o una chiamata i telefoni ti mandano delle
stringhe tipo RING che se non gestite bene imballano le routine.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Ho scoperto dove sta il problema.
Il codice è ok, anche perche le utilità fornite con uclinux (tip, pppd etc)
fallivano come il mio programma, e quindi ho indagato a fondo, quello che ho
scoperto è che un certo processo, che si chiama "/bin/agetty 38400 ttyS0"
rompe le scatole. Mi spiego:
Faccio partire il mio programma, fa un po' di tentativi e quando riceve
AT\nOK entra nel suo loop ed esegue diversi comandi at ciclicamente, fa
tutto perfettamente, non perdo un carattere, tutto bene quindi? No!
Guarda caso quando il modem funziona, e ricevo dati il processo "/bin/agetty
38400 ttyS0" sparisce ma appare un certo "/bin/login -- at" fino a che
questo processo esiste il mio codice funziona, poi quando se ne va senza
motivo (almeno per la mia ignoranza è così) e ritorna "/bin/agetty 38400
ttyS0" il programmino non riceve più niente e tutti i settaggi sulla seriale
che ho fatto nel codice vengono spazzati via...
Quindi:
1: Sapete che cosa cavolo faccia li programmino agetty?
2: Come posso farlo sparire dal sistema visto che se lo killo quello torna
su?
3: Il processo login che cavolo ci va li?
Come al solito scusate la mia ignoranza, ma quasi ci siamo!!!!!
Vi prego aiuto!!!!!


LOL.
Quello e' il programma che, appunto, gestisce la console sulla seriale:
quando riceve dei dati in input li interpreta come un tentativo di login,
chiama il programma login per verificare i presunti nome utente e password,
non trovandoli di suo gradimento dopo un po' si stufa e ricomincia d'accapo.
E se tenti di killarlo init lo fa ripartire automaticamente.
Soluzione: cambia porta seriale o modifica /etc/inittab.
Ciao.
Alessandro.

 stringhe tipo RING che se non gestite bene imballano le routine.
AT+CRC=1 fa si che il modem invii \r\n+CRING: VOICE\r\n invece che
RING\r\n. In questo modo se gestisci i dati del modem in maniera
asincrona puoi parsare piu facilmente il comando e reagire di
conseguenza.
ciao
twism
-- 
Io me ne fotto del prossimo, figuriamoci del primo.

 rompe le scatole. Mi spiego:
[...]
In /etc/inittab dovresti avere una riga _simile_ a questa:
T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
Commentala.
-- 
 Ciao, Bianco.                         Reply to luca.bianco (at) 
tiscali.it
|--------[Powered by Debian GNU/Linux Sarge - 2.4.19 - AMD K6-200]--------|
|------------[Linux Registered User #287769 - Machine #169192]------------|