test_modem.c 2.2 KB
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

/** Constantes **/

#define SERIALDEV	"/dev/ttyUSB0"
#define BAUDRATE	B9600
#define TAILLE_TAMPON	3

void Reponse(int ds)
{
  register int i;
  char d[TAILLE_TAMPON];
  sync();
  for(i=0;i<TAILLE_TAMPON;i++){
    if(read(ds,d+i,1)!=1){ perror("Reponse.read"); exit(-1); }
    if(d[i]==0x0d) break;
  }
  int size=i;
  for(i=0;i<size;i++)
    if(d[i]!=0x0d) fprintf(stdout,"%c",d[i]);
  if(size>0) fprintf(stdout," (");
  for(i=0;i<size;i++){
    fprintf(stdout,"%.2x",d[i]);
    if(i<size-1) fprintf(stdout," ");
  }
  if(size>0) fprintf(stdout,")\n");
}

void ModeCommande(int ds)
{
  #ifdef DEBUG
  printf("{ModeCommande}\n");
  #endif
  char *cmd="+++++++++++++++++"; //Obligation de saturer le buffer pour send commande
  sleep(1);
  sync();
  write(ds,cmd,strlen(cmd));
  Reponse(ds);
}

void Answer(int ds)
{
  #ifdef DEBUG
  printf("{Answer}\n");
  #endif
  char *cmd="TAATAATAATAATAATA\r"; //Saturation buffer
  write(ds,cmd,strlen(cmd));
  Reponse(ds);
}

static struct termios sauvegarde;

/** Ouverture d'un port serie **/

int ouvertureSerie(char *periph,int vitesse)
{
  struct termios nouveau;
  int df=open(periph,O_RDWR|O_NOCTTY);
  if(df<0) return -1;

  tcgetattr(df,&sauvegarde); /* save current port settings */
  bzero(&nouveau,sizeof(nouveau));
  nouveau.c_cflag=CLOCAL|CREAD|vitesse|CS8;
  nouveau.c_iflag=0;
  nouveau.c_oflag=0;
  nouveau.c_lflag=0;
  nouveau.c_cc[VTIME]=0;
  nouveau.c_cc[VMIN]=1;
  tcflush(df, TCIFLUSH);
  tcsetattr(df,TCSANOW,&nouveau);

  return df;
}

/** Fermeture d'un port serie **/

void fermetureSerie(int df)
{
  tcsetattr(df,TCSANOW,&sauvegarde);
  close(df);
}

/** Programme principal **/

int main(void) {
  int ds;
  ds=ouvertureSerie(SERIALDEV,BAUDRATE);
  if(ds<0){
    fprintf(stderr,"Erreur sur la connexion série.\n");
    exit(-1);
  }
  char enter = '\r';
  ModeCommande(ds);
  write(ds, &enter, 1);
  write(ds, &enter, 1);
  write(ds, &enter,1);
  write(ds,&enter,1);
  write(ds,&enter,1);
  Answer(ds);
  sleep(15);
  write(ds,&enter,1);
  fermetureSerie(ds);
  return 0;
}