Code:
#include <sys/time.h> //temps
#include <unistd.h>
//-----------------------------------------------------------------------------
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h> // settins du port serie
#include <stdio.h>
//-----------------------------------------------------------------------------
#include <stdlib.h> //fichier
//-----------------------------------------------------------------------------
#define BAUDRATE B1200 // baudrate settings sont définis dans <asm/termbits.h>, qui est inclus par <termios.h>
#define ADRESSE_PORT "/dev/ttyS0" // numero du port
#define _POSIX_SOURCE 1 // source conforme à POSIX
//---------------- Timer ------------------------------------------------------
struct timeval tv1,tv2;
struct timezone tz;
long long delta_temps;
//----------------- Fichier ---------------------------------------------------
int mesure_impulsions; //ecriture ds le fichier
char nom_fichier[200] ; // On initialise la variable à 0
//-----------------------------------------------------------------------------
volatile int STOP=0;
int fd, c, res;
struct termios oldtio, newtio;
char buf[255]; // nombre max de caracteres dans le buffuer pour une lecture
char dep_x, dep_y;
int deplacement_x();
int deplacement_y();
//-----------------------------------------------------------------------------
// Open modem device pour lecture + écriture et pas comme controleur tty car on ne veut pas etre détruit si on recoit un caractère CTRL-C.
main()
{
printf("Mesure \n\nVeuillez introduire le nom du fichier: ");
scanf("%s", &nom_fichier); // On demande d'entrer le nom
fd = open(ADRESSE_PORT, O_RDWR | O_NOCTTY );// O_NOCTTY flag dit que ce progr n'est pas un "controlling terminal" pour ce port. Si on ne le spécifie pas, chaque input (such as keyboard abort signals and so forth) va affecter le process. normally a user program does not want this behavior.
if (fd <0) {perror(ADRESSE_PORT); exit(-1); }
tcgetattr(fd,&oldtio); // sauve config courante
bzero(&newtio, sizeof(newtio)); // on initialise la structure à zéro
newtio.c_cflag = BAUDRATE | CRTSCTS | CS7 | CLOCAL | CREAD; // BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.
// CRTSCTS : contrôle de flux matériel (uniquement utilisé si le câble a les lignes nécessaires. Voir la section 7 du Serial-HOWTO).
// CS8 : 8n1 (8bit,no parity,1 stopbit)
// CLOCAL : connexion locale, pas de contrôle par le modem
// CREAD : permet la réception des caractères
newtio.c_iflag = IGNPAR; // IGNPAR : ignore les octets ayant une erreur de parité.
// ICRNL : transforme CR en NL (sinon un CR de l'autre côté de la ligne ne terminera pas l'entrée). sinon, utiliser l'entrée sans traitement (device en mode raw).
newtio.c_oflag = 0; // positionne le mode de lecture(non-canonical, no echo,...)
newtio.c_lflag = 0; // si ICANON : active l'entrée en mode canonique désactive toute fonctionnalité d'echo, et n'envoit pas de signal au programme appelant.
// initialize all control characters
// default values can be found in /usr/include/termios.h, and are given in the comments, but we don't need them here
newtio.c_cc[VTIME] = 0; // timer inter-caractères non utilisé
newtio.c_cc[VMIN] = 3; // read bloquant jusqu'à ce que 3 caractères soient lus
// now clean the modem line and activate the settings for the port
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
// la configuration du terminal est faite, à présent on traite les entrées
//--------------------------------------------------------------------------------
while (STOP==0) { // boucle jusqu'à condition de terminaison read bloque l'exécution du programme jusqu'à ce qu'un caractère de fin de ligne soit lu, même si plus de 255 caractères sont saisis.
//Si le nombre de caractères lus est inférieur au nombre de caractères disponibles, des read suivant retourneront les caractères restants.
//res sera positionné au nombre de caractères effectivement lus
res = read(fd,buf,255); // returns after xxx chars have been input
buf[res]=0;
gettimeofday(&tv2, &tz);
delta_temps=(tv2.tv_sec-tv1.tv_sec) * 1000000L + (tv2.tv_usec-tv1.tv_usec); //calcul delta temps
//-----------------------AFFICHAGE ECRAN--------------------------------------------------------------
//deplacement_x();
//deplacement_y();
gettimeofday(&tv1, &tz);
char octet1,octet2,octet3;
//octet1=buf[0];
//octet2=buf[1];
//octet3=buf[2];
printf("%03d %03d %03d %03d %03d", buf[0], buf[1], buf[2], buf[3], buf[4]);
//printf("%02d %02d %02d", octet1, octet2, octet3);//affiche les deplacamants x et y
printf(" %d microsec\n", delta_temps);//affiche le temps
//-----------------------ECRITURE FICHIER------------------------------------------------------------
mesure_impulsions = fopen(nom_fichier, "a+");//ecriture ds fichier
fprintf(mesure_impulsions,"%03d %03d %03d %03d %03d %d usec\n", buf[0], buf[1], buf[2], buf[3], buf[4], delta_temps);
fclose(mesure_impulsions);
//---------------------------------------------------------------------------------------------------
if (buf[0]=='z') STOP=1;
}
tcsetattr(fd,TCSANOW,&oldtio); // restaure les anciens paramètres du port
}