Newsgroup: it.comp.os.linux.sys
Titolo: Come settare una porta seriale su dispositivo USB?

   Sto cercando di comunicare da script con alcune chiavette USB HDSPA. Le 
connessioni funzionano, ma non "sempre", e io ho bisogno di sapere che 
funzionino *sempre* perche' devo usarle per test diagnostici proprio delle 
chiavette.
Sembra che quello che ricevo sia lo stesso buffer ripetuto N volte. Ecco un 
esempio:
  Le inserisco, do' un opportuno
$ /sbin/modprobe usbserial vendor=0x$VID product=0x$PID
$ chmod 777 /dev/ttyACM0
  e ottengo una porta seriale /dev/ttyACM0:
$ ls -l /dev/ttyACM0
crwxrwxrwx 1 root dialout 166, 0 2009-04-29 14:36 /dev/ttyACM0
Primo problema: setserial non la vede:
$ setserial /dev/ttyACM0
Cannot get serial info: Invalid argument
  quindi setto (anche da script) la velocita' con stty:
$ stty -F /dev/ttyACM0 57600
$ stty -F /dev/ttyACM0
speed 57600 baud; line = 0;
-brkint -imaxbel
  e cerco di comunicare cosi' (esempio fatto a terminale, nello script ho usato 
anche cat al posto di tee):
$ tee </dev/ttyACM0 .pippo &
[1] 12948
$ echo AT >/dev/ttyACM0 $ AT
ERROR
AT
OK
AT
OK
AT
....(ripetute un sacco di volte)
OK
AT
OK
  Non e' un problema di terminale, infatti:
killall tee
[1]+  Terminated              tee .pippo < /dev/ttyACM0
$ hexdump -C .pippo
00000000  41 54 0a 0a 0a 45 52 52  4f 52 0a 0a 41 54 0a 0a  |AT...ERROR..AT..|
00000010  0a 4f 4b 0a 0a 41 54 0a  0a 0a 4f 4b 0a 0a 41 54  |.OK..AT...OK..AT|
00000020  0a 0a 0a 4f 4b 0a 0a 41  54 0a 0a 0a 4f 4b 0a 0a  |...OK..AT...OK..|
00000030  41 54 0a 0a 0a 4f 4b 0a  0a 41 54 0a 0a 0a 4f 4b  |AT...OK..AT...OK|
00000040  0a 0a 41 54 0a 0a 0a 4f  4b 0a 0a 41 54 0a 0a 0a  |..AT...OK..AT...|
00000050  4f 4b 0a 0a 41 54 0a 0a  0a 4f 4b 0a 0a 41 54 0a  |OK..AT...OK..AT.|
00000060  0a 0a 4f 4b 0a 0a 41 54  0a 0a 0a 4f 4b 0a 0a 41  |..OK..AT...OK..A|
00000070  54 0a 0a 0a 4f 4b 0a 0a  41 54 0a 0a 0a 4f 4b 0a  |T...OK..AT...OK.|
00000080  0a 41 54 0a 0a 0a 4f 4b  0a 0a 41 54 0a 0a 0a 4f  |.AT...OK..AT...O|
00000090  4b 0a 0a 41 54 0a 0a 0a  4f 4b 0a 0a 41 54 0a 0a  |K..AT...OK..AT..|
000000a0  0a 4f 4b 0a 0a 41 54 0a  0a 0a 4f 4b 0a 0a 41 54  |.OK..AT...OK..AT|
000000b0  0a 0a 0a 4f 4b 0a 0a 41  54 0a 0a 0a 4f 4b 0a 0a  |...OK..AT...OK..|
000000c0  41 54 0a 0a 0a 4f 4b 0a  0a 41 54 0a 0a 0a 4f 4b  |AT...OK..AT...OK|
000000d0  0a 0a 41 54 0a 0a 0a 4f  4b 0a 0a 41 54 0a 0a 0a  |..AT...OK..AT...|
000000e0  4f 4b 0a 0a 41 54 0a 0a  0a 4f 4b 0a 0a 41 54 0a  |OK..AT...OK..AT.|
000000f0  0a 0a 4f 4b 0a 0a 41 54  0a 0a 0a 4f 4b 0a 0a 41  |..OK..AT...OK..A|
00000100  54 0a 0a 0a 4f 4b 0a 0a  41 54 0a 0a 0a 4f 4b 0a  |T...OK..AT...OK.|
00000110  0a 41 54 0a 0a 0a 4f 4b  0a 0a 41 54 0a 0a 0a 4f  |.AT...OK..AT...O|
00000120  4b 0a 0a 41 54 0a 0a 0a  4f 4b 0a 0a 41 54 0a 0a  |K..AT...OK..AT..|
00000130  0a 4f 4b 0a 0a 41 54 0a  0a 0a 4f 4b 0a 0a 41 54  |.OK..AT...OK..AT|
00000140  0a 0a 0a 4f 4b 0a 0a 41  54 0a 0a 0a 4f 4b 0a 0a  |...OK..AT...OK..|
00000150  41 54 0a 0a 0a 4f 4b 0a  0a 41 54 0a 0a 0a 4f 4b  |AT...OK..AT...OK|
00000160  0a 0a 41 54 0a 0a 0a 4f  4b 0a 0a 41 54 0a 0a 0a  |..AT...OK..AT...|
00000170  4f 4b 0a 0a 41 54 0a 0a  0a 4f 4b 0a 0a 41 54 0a  |OK..AT...OK..AT.|
00000180  0a 0a 4f 4b 0a 0a 41 54  0a 0a 0a 4f 4b 0a 0a 41  |..OK..AT...OK..A|
00000190  54 0a 0a 0a 4f 4b 0a 0a  41 54 0a 0a 0a 4f 4b 0a  |T...OK..AT...OK.|
000001a0  0a 41 54 0a 0a 0a 4f 4b  0a 0a 41 54 0a 0a 0a 4f  |.AT...OK..AT...O|
000001b0  4b 0a 0a 41 54 0a 0a 0a  4f 4b 0a 0a 41 54 0a 0a  |K..AT...OK..AT..|
000001c0  0a 4f 4b 0a 0a 41 54 0a  0a 0a 4f 4b 0a 0a 41 54  |.OK..AT...OK..AT|
000001d0  0a 0a 0a 4f 4b 0a 0a 41  54 0a 0a 0a 4f 4b 0a 0a  |...OK..AT...OK..|
000001e0  41 54 0a 0a 0a 4f 4b 0a  0a                       |AT...OK..|
000001e9
Come diavolo potrei settare la porta?
(Non vorrei scrivermi un programma in c che chiami termios. Ma, anche in questo 
caso, che parametri potrebbere essere sballati di default?)
grazie

 $ echo AT >/dev/ttyACM0
  Sono un perfetto ignorante in materia ma provo lo stesso: non e' che
e' un problema di echo? Hai provato questi due?
echo -e 'AT' > /dev/ttyACM0
echo -e 'AT \n' > /dev/ttyACM0
  Saluti,
-- 
Gianfranco Bertozzi
Linux User #183585

   Saluti,
grazie lo stesso, ciao
--
TRu-TS

  e ottengo una porta seriale /dev/ttyACM0:
Nota bene: dopo queste operazioni, il modem viene utilizzato senza problemi sia 
via minicom che da vWdial. Evidentemente fanno qualche operazione di 
inizializzazione sul device, ma quali? :-(
Grazie a chi ha qualche idea
--
TRu-TS

 $ echo AT | hexdump -C
  Gia'. Bastava pensarci. :-)
  Comunque ho notato che se utilizzi minicom per vedere le risposte ai
comandi che invii via echo (da un altro terminale), queste cambiano in
base al comando che dai anche se con hexdump sembra la stessa cosa.
  Non so se puo' esserti utile per una traccia. Inoltre le ripetizioni
che talvolta appaiono sul terminale (cat, less, tail, tee...) non le ho
mai viste usando minicom.
  Magari non ti serve a nulla, magari si. Io la buona volonta' ce l'ho
messa. ;-) 
  Un saluto,


 mai viste usando minicom.
Infatti, minicom e wvdial funzionano correttamente su ttyACM0, per cui ipotizzo 
che facciano qualche settaggio via termios prima di cominciare a sparare 
caratteri sulla porta.
Ho ripiegato su una tecnica che mi aveva mostrato JohnnyNewbie su icoli. in un 
3D cui avevi partecipato anche tu:
http://groups.google.it/group/it.comp.os.linux.iniziare/msg/a75102ad84a33da5?hl=it
cat < /dev/ttyACM0 (oppure tee < /dev/ttyACM0 .logfile
chat    ""   "AT+COPS?"  < /dev/ttyACM0   > /dev/ttyACM0
eccetera
che funziona perfettamente, anche se mi sfugge completamente il perche' della 
doppia redirezione di stdin e stdou di chat.
Evidentemente anche chat fa qualche settaggio via termios prima di cominciare a 
scrivere.
E adesso mi metto a leggere con cura man chat e i simbolici di minicom, wvdial e 
chat, sperando di trovare le chiamate a termios che mi svelino il mistero.
Se ci capisco qualcosa di definitivo lo condivido.
ciao e grazie
--
TRu-TS