Newsgroup: it.comp.os.linux.sys
Titolo: Comunicare col modem: chat e controllo baud

Il mio modem:
nokia 6230 collegato via usb al pc ---> /dev/ttyACM0 usando i
moduli cdc-acm.
Con programmi di comunicazione come minicom o pppd si riesce a
controllare il baud ovvero la "velocita" con cui comunicare col
modem. Con minicom questo viene impostato in fase di
configurazione della porta /dev/ttyACM0, mentre con pppd si
definisce o in uno script oppure anche da riga di comando:
pppd /dev/ttyACM0 57600
dove 57600 è appunto il valore del baud in bps.
Per vari motivi ho bisogno di comunicare col modem piuttosto
lentamente. Quindi in certi casi, mi occorre impostare il baud
piuttosto basso.
Ok, mettiamo un'attimo da parte tutto questo.
---
Sto facendo alcune prove di invio dei comandi AT al modem e
valutazione delle rispsote che ritorna.
Ho provato a fare uno script bash capace di inviare comandi AT
appunto e guardare quale sia l'esito del comando inviato, quindi
prendere alcune decisioni eseguendo un'operazione piuttosto che
un'altra.
Per comunicare al modem i comandi ho utilizzato il programma
"chat" reindirizzando l'input e l'output al/dal device
/dev/ttyACM0. La sessione può essere guardata dal terminale
(std-output) con un semplice "cat" sul /dev/ttyACM0:
in pratica da un terminale invio i comandi e in un'altro guardo
quello che riceve e risponde.
Per tradurre tutto questo in uno script ho rediretto l'output e
l'error del cat verso un file di testo, su questo file viene
valutato automaticamente il responso del modem usando grep.
A scanso d'equivoci prima dell'invio di ogni comando con chat, il
file di testo viene riplito con "echo > $LOG" dove appunto $LOG è
il nostro file di testo.
In pratica una cosa del genere:
===
LOG=/home/johnny/chat.prove/log
cat /dev/ttyACM0 > $LOG 2>&1&
echo > $LOG
chat -v -t 10 "" 'AT+CGATT?' > /dev/ttyACM0 < /dev/ttyACM0
while ! grep '+CGATT: 1' $LOG; do
 sleep 5
 echo > $LOG
 chat -v -t 10 "" 'AT+CGATT=1' > /dev/ttyACM0 < /dev/ttyACM0
 sleep 2
 echo > $LOG
 chat -v -t 10 "" 'AT+CGATT?' > /dev/ttyACM0 < /dev/ttyACM0
 sleep 2
done
===
---------
Bene ora facendo mente locale su quanto detto all'inizio a
proposito del baud cerco di riassumere la mia domanda cui spero
possiate rispondere:
il comando
chat -v -t 10 "$EXPECT" "$SEND" > /dev/ttyACM0 < /dev/ttyACM0
invia al device il comando AT che ho chiamato genericamente
"$SEND", senza alcun controllo in merito alla velocità con cui
viene inviato.
Non mi pare che chat invii tutto ciò autoimpostando un certo
valore di baud.
Io vorrei usare chat liscio, in modo da poterlo infilare in uno
script bash come esemplificato sopra, tuttavia vorrei anche
provare ad impostare in qualche modo la velocità con la quale
chat invia la coppia send expect al modem.
Dal man chat non ho trovato nulla.
Potrebbe anche essere che chat si limiti ad inviare coppie send
expect senza preoccuparsi di "come" inviarle, demandando quindi
la velocità di comunicazione ad altri, per esempio a pppd.
Non c'è qualche scappatoia per riuscirvi?
Visto che potrei aver esposto l'argomento in modo un po'
contorto, vi esorto a richiedermi ulteriori precisazioni se
vorreste rispondere ma la mia spiegazione vi frena in qualche
modo.  ;-)          Non esitate!  :-P
Ringrazio in anticipo. Saluti!  :-)
PS. L'argomento è piuttosto tecnico...
    Non è proprio da ICOLI, tuttavia visto l'affollamento del ng
    ho pensato di crosspostare su ICOLS e ICOLI, con "follwup-to:"
    verso ICOLI, spero che sia la scelta giusta.
    Anzi se aveste consigli in merito, non esitate mi raccomando!
    ;-)

 la velocità di comunicazione ad altri, per esempio a pppd.
Penso proprio che sia come dici.
Se non sei obbligato ti conviene utilizzare un'altra strada, con poche righe
di perl infatti te la cavi molto più egregiamente e in maniera più pulita.
Usando il modulo Serial(cercalo su cpan) puoi fare una cosa del genere
use Device::SerialPort;
my $port = Device::SerialPort->new("/dev/ttyUSB0");
$port->databits(8);
$port->baudrate(19200);
$port-write('AT+CGATT?')
Guardati la documentazione.
Ciao
Giovanni.

 Usando il modulo Serial(cercalo su cpan) puoi fare una cosa del genere
Su ICOLI mi hanno risposto che � sufficente impostare la porta
in questione (per esempio /dev/ttyACM0) con stty:
# modem=/dev/ttyACM0
# stty <$modem
speed 57600 baud; line = 3;
min = 1; time = 0;
ignbrk -brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
questo rivela il valore attuale del baud di comunicazione, a
quanto ho capito.
# stty speed 9600 <$modem >$modem
questo invece dovrebbe settare il baud al valore indicato, per
esempio 9600bps.
Non sono pratico di perl, mi fermo solo a bash, vorrei cavarmela
con bash, senza dover imparare perl phyton o altri linguaggi pi�
evoluti. Grazie comunque del consiglio. A presto.