Newsgroup: it.comp.lang.c
Titolo: Comunicazione con la porta seriale --> Linux!

Salve
io avrei bisogno di creare un programmino in c in grado di poter
comunicare con la porta USB alla quale è collegato un  modem!
ho cercato molto in rete ma non ho trovato molto che mi funzioni su
Ubuntu. Ho provato anche con WIn ma 0 risultati! :(
allego parte di script trovati in rete:
#include <stdio.h>
int main()
{
   /* dichiara lo stream e il prototipo della funzione fopen */
   FILE *stream, *fopen();
   /* apre lo stream del file */
   stream = fopen("/dev/ttyACM1", "w");
   /* controlla se il file viene aperto */
   if ((stream = fopen("/dev/ttsACM1", "w")) == NULL)
   {
      printf("Non posso aprire il file ");
    }else
	printf("il file viene aperto correttamente");
}
Il compilatore  (gcc) mi da' errore quando vado a compilarlo
dicendomi :
file not recognized: File format not recognized
Qualcuno mi sa aiutare?? :D
Grazie a Tutti!!


Molto strano, a quale riga ti dà quell'errore?
E.

 Qualcuno mi sa aiutare?? :D
Solitamente quell'errore si ha quando si prova a
compilare un file senza l'estensione .c
Salut.


ok! Grazie questo errore di compilazione l'ho risolto .. infatti
abituato a win che lo mette in automatico...
Cmq non riesco a comunicare con il modem...
la uso come se fosse un file.... infatti se cambio l' fopen con un
file di testo, lui ci scrive sopra ma invece la porta seriale non mi
da' risposte....
come mai ?
cosa puo' essere?
c'e' qualcuno che mi sa dire qualcosa anche con qualche esempio
funzionante!?   :-)
GRazie!

 qualche esempio funzionante!?   :-) GRazie!
La porta seriale la devi inizializzare prima di poterla usare.  Non 
basta aprirla come un file.
Inoltre la tua seriale è attraverso la porta USB e probabilmente 
richiede che sia caricato il driver opportuno.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >


Ah!! :( e come si fa'? che parametri devo passare e come? hai per caso
qualche esempio? io posto quello che ho provato a scrivere ma non
funziona e mi da' errore e precisamente questo:
Segmentation fault (core dumped)
ho letto che da' questo errore quando un vettore sfora... ma qua non
so dove!:(
#include <stdio.h>
#include <stdlib.h>
main(){
FILE *conn;
char chiama[20]="atd345000000\r";
if ((conn= fopen("/dev/ttyACM1/", "w+"))==NULL)
printf("Impossibile aprire il File\n");
else
printf("Comunicazione aperta \n");
fprintf(conn, chiama);
return 0;
}
se mi aiuti te ne sarei molto grato!
Grazie mille a tutti!
D.

Ciao, con la seriale ci ho litigato in questi ultimi mesi, sembra una di 
quelle cose che e' talmente semplice e tutti sanno che nessuno ti dice 
niente :-)
Prima di tutto qualche link:
http://www.easysw.com/~mike/serial/serial.html
http://tldp.org/HOWTO/Serial-HOWTO.html
Attento che sono molto vecchi (anche 10 anni!) e un po' di cose sono ormai 
obsolete. Dopodiche' mi e' stato di molto aiuto il sorgente di un 
programmino di interfacciamento seriale tipo hyperterminal (ma piu' bello 
:-), si chiama "cutecom": c'e' tutto il codice per aprire e settare la 
seriale.
Infine, un piccolo esempio dal mio programma (non certo da manuale, non sono 
un programmatore, ma per darti un'idea):
int apri_seriale(char *serialdevice) {
 int fd;
 fd = open(serialdevice, O_RDWR | O_NDELAY);
 if(fd < 0) {
  printf("Impossibile aprire la porta seriale \"%s\"\n", serialdevice);
  perror("");
  return -1;
 }
 tcflush(fd, TCIOFLUSH); //flush di input e output
 fcntl(fd, F_SETFL, 0); //setta lettura bloccante
 return fd;
}
int config_seriale(int fd) {
 struct termios options;  //opzioni per la porta seriale
 memset(&options, 0, sizeof(struct termios)); //azzera la struttura delle 
opzioni per scriverla da zero
 cfsetispeed(&options, (speed_t)B57600);  //setta la velocita' di input 
[B115200, B57600]
 cfsetospeed(&options, (speed_t)B57600);  //setta la velocita' di output
 options.c_cflag |= (CREAD | CS8 | CLOCAL); // CS8 = 8 data bits; CREAD = 
enable receiver; CLOCAL = local line, do not change owner of port;
       //dato che ho azzerato tutta la struttura all'inizio non devo 
disattivare CSTOPB (per avere 1 bit di stop) e PARENB (per eliminare la 
parita'); dopo aver settato CS8 ho gia' di default la modalita' 8N1 (8 bit, 
no parita', 1 bit di stop)
 options.c_iflag = IGNBRK;
 options.c_lflag = 0; //"raw input" (ridondante, era gia' stato messo a zero 
dalla memset)
 options.c_oflag = 0; //"raw output" (ridondante, era gia' stato messo a 
zero dalla memset)
 options.c_cc[VMIN] = 1; //queste due settano la lettura bloccante (deve 
essere letto almeno un carattere, timeout disattivato)
 options.c_cc[VTIME] = 0;
 tcsetattr(fd, TCSANOW, &options); //setta le opzioni per la porta
 return 0;
}
Setto la velocita' I/O a 57600 baud (le altre costanti le trovi sui siti che 
ho postato), modalita' 8N1 (8 bit, no parita', 1 bit di stop), raw input e 
output (cioe' niente interpretazione dei caratteri, voglio ogni singolo byte 
perche' sto ricetrasmettendo dati che vengono interpretati a livello 
superiore), e lettura bloccante senza timeout (poi quando mi serve "non 
bloccante" uso la ioctl per sapere se ci sono dati nel buffer).
Spero ti possa aiutare,
Pleg
PS: questo per un programma che mi gira sotto Debian e sotto WinXP su 
Cygwin, quindi non dovresti avere problemi.

 Prima di tutto qualche link:
http://www.easysw.com/~mike/serial/serial.htmlhttp://tldp.org/HOWTO/Serial-HOWTO.html

Grazie mille ... è proprio quello che cercavo... ma purtroppo ho
appena iniziato a fare il c e non mi tornano alcune cose....
non ho capito come devo inserire questi 2 pezzi di codice che mi hai
gentilmente fornito!
ti seri grato se mi riuscissi a fare un fax- simile del file
funzionante che si colleghi al modem e gli passi la stringa
"ATD346000000" , con la quale si effettua una chimata a tale numero!
Grazie mille e scusa x il disturbo

 > Prima di tutto qualche link:
http://www.easysw.com/~mike/serial/serial.htmlhttp://tldp.org/HOWTO/S.
..

Sono riuscito a risolvere!! Grazie lo stesso! :D :D :D

 
magari dillo come... :P

 tale numero!
http://alioth.debian.org/projects/minicom/
Qui potrai trovare i sorgenti di minicom un emulatore di terminale 
molto diffuso in ambiente linux


non riesco a leggere i dati che mi passa...
nella pagina che mi hai dato ho trovato quest funzione x leggere...
    int                  /* O - 0 = MODEM ok, -1 = MODEM bad */
    init_modem(int fd)   /* I - Serial port file */
    {
      char buffer[255];  /* Input buffer */
      char *bufptr;      /* Current char in buffer */
      int  nbytes;       /* Number of bytes read */
      int  tries;        /* Number of tries so far */
      for (tries = 0; tries < 3; tries ++)
      {
       /* send an AT command followed by a CR */
	if (write(fd, "AT\r", 3) < 3)
	  continue;
       /* read characters into our string buffer until we get a CR or
NL */
	bufptr = buffer;
	while ((nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr -
1)) > 0)
	{
	  bufptr += nbytes;
	  if (bufptr[-1] == '\n' || bufptr[-1] == '\r')
            break;
	}
       /* nul terminate the string and see if we got an OK response */
	*bufptr = '\0';
	if (strncmp(buffer, "OK", 2) == 0)
	  return (0);
      }
      return (-1);
    }
ma non riesco a capire xkè non mi funziona e perche' debba eseguire 3
volte il comando!!   :|
Grazie

 volte il comando!!   :|
Questa funzione nin è per leggere, ma per inizializzare il modem.
Il terminale deve già essere inizializzato compresa la velocità (bps).
La funzione non esegue 3 volte il comando, ma fa 3 tentativi fino a 
che il modem non ritorna OK in risposta al comando AT\r
In ogni caso sarebbe meglio che tu passassi su 
it.comp.os.linux.development anziché continuare qui.
