1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
| /*
Adapted de serial_test.c
Very simple serial tester
For more info see: http://www.acmesystems.it/?id=50
Copyright (C) 2005 Acme Systems srl (http://www.acmesystems.it)
By Sauvergeat Magali
This is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdarg.h>
#include <signal.h>
#define FILEMAX 500 // taille du fichier Maximum
#define BUFFER 100 // taille du buffer
#define DEBUG 0 // variable pour la recherche d'erreur
struct termios tty_saved_attributes;
int tty_fd;
int tty_open(char* tty_dev)
{
char choix[20];
struct termios new_attributes;
//tty_fd = open(tty_dev,O_RDWR| O_NOCTTY | O_NONBLOCK);
tty_fd = open(tty_dev,O_RDWR| O_NOCTTY );
if (tty_fd<0)
{
return -1;
}
else
{
tcgetattr(tty_fd,&tty_saved_attributes);
printf("\n Voulez vous modifier la configuration de la liaison sérié ? (y/N) :");
gets(choix);
if ((!strcmp(choix,"Y"))||(!strcmp(choix,"y")))
{
tcgetattr(tty_fd,&new_attributes);
// Set the new attributes for the serial port
// http://linux.about.com/library/cmd/blcmdl3_termios.htm
//http://www.gnu.org/software/libc/manual/html_node/Low_002dLevel-I_002fO.html
printf("\n Vitesse de la liaison série? 4800 ,9600,19200,38400 (defaut 38400) :");
gets(choix); // Set baud rate
if (!strcmp(choix,"4800")) new_attributes.c_cflag |= B4800;
else if (!strcmp(choix,"9600")) new_attributes.c_cflag |= B9600;
else if (!strcmp(choix,"19200")) new_attributes.c_cflag |= B19200;
else new_attributes.c_cflag |= B38400;
printf("\n Nombre de bits par transmission? 6, 7, 8 (defaut 8) :");
gets(choix);
if (!strcmp(choix,"6")) new_attributes.c_cflag |= CS6;
else if (!strcmp(choix,"7")) new_attributes.c_cflag |= CS7;
else new_attributes.c_cflag |= CS8; // 8 data bit
printf("\n Type de parité ? A (Aucune), P (Paire), I(Impaire) (defaut Aucune) :");
gets(choix);
if (!strcmp(choix,"P"))
{
new_attributes.c_cflag |= PARENB; // active la parité
new_attributes.c_cflag |= ~(PARODD);
}
else if (!strcmp(choix,"I"))
{
new_attributes.c_cflag |= PARENB; // active la parité
new_attributes.c_cflag |= PARODD;
}
else new_attributes.c_cflag |= ~(PARENB); // desactive la parité
// c_cflag
new_attributes.c_cflag |= CREAD; // Enable receiver
// c_iflag
new_attributes.c_iflag |= IGNPAR; // Ignore framing errors and parity errors
// c_lflag
new_attributes.c_lflag &= ~(ICANON); // DISABLE canonical mode.
// Disables the special characters EOF, EOL, EOL2,
// ERASE, KILL, LNEXT, REPRINT, STATUS, and WERASE, and buffers by lines.
new_attributes.c_lflag &= ~(ECHO); // DISABLE this: Echo input characters.
new_attributes.c_lflag &= ~(ECHOE); // DISABLE this: If ICANON is also set, the ERASE character erases the preceding input
// character, and WERASE erases the preceding word.
new_attributes.c_lflag &= ~(ISIG); // DISABLE this: When any of the characters INTR, QUIT, SUSP,
// or DSUSP are received, generate the corresponding signal.
new_attributes.c_cc[VMIN]=1; // Minimum number of characters for non-canonical read.
new_attributes.c_cc[VTIME]=0; // Timeout in deciseconds for non-canonical read.
tcsetattr(tty_fd, TCSANOW, &new_attributes);
}
}
return tty_fd;
}
void termination_handler (int signum)
{
if (tty_fd>0) tcsetattr (tty_fd,TCSANOW,&tty_saved_attributes);
close(tty_fd);
printf("Exit\n");
exit(0);
}
int recopie_serie(int filefd,int ttyfd, char * buff)
{
int i=0,j=0;
while ((i<FILEMAX)||(buff[j]!='\n'))
{
j=i%BUFFER;
read (ttyfd,&buff[j],1);
//printf("%c",buff[j]);
write (filefd,&buff[j],1);
i++;
}
if (DEBUG) printf(" Valeur de i : %d\n",i);
return j;
}
int main(int argc, char *argv[])
{
char buff[BUFFER];
char * nomfichier="/tmp/com.txt";
char * ttynom= "/dev/ttyS0";
int ttyfd;
int filefd;
int v,j;
if (argc<3)
{
printf(" Buferisation de la liaison série\n ");
printf(" Utilisation \"serial_buffer.out NomfichierBuffer.txt fichier de la liaison série \" \n");
printf(" valeur par défaut \"serial_buffer.out /tmp/com.txt /dev/ttyS0 \" \n");
printf(" /dev/ttyS0 représente le nom de la liaison série 0, ttyS0 com0 et ttyS1 com1 \n");
printf(" Pour lancer le programme en tache de fond utiliser le caractère & en fin de ligne de commande \n");
printf(" Exemple: \"./serial_buffer.out /tmp/com.txt /dev/ttyS0 & \" \n");
printf(" Pour lancer le programme et configurer la liaison série \n");
printf(" Exemple: \"./serial_buffer.out /tmp/com.txt /dev/ttyS0 conf \" \n");
}
else
{
nomfichier =argv[1];
ttynom=argv[2];
}
if ((filefd=open(nomfichier,O_CREAT | O_WRONLY|O_TRUNC))<0)
{
fprintf (stderr,"Ouverture fichier erreur %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
if (argc ==4 )
{
if ((ttyfd= tty_open(ttynom))<0)
{
fprintf (stderr,"Ouverture tty erreur %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
}
else
{
ttyfd = open(ttynom,O_RDWR| O_NOCTTY );
if (tty_fd<0)
{
fprintf (stderr,"Ouverture tty erreur %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
}
if (signal (SIGINT, termination_handler) == SIG_IGN) signal (SIGINT, SIG_IGN);
if (signal (SIGHUP, termination_handler) == SIG_IGN) signal (SIGHUP, SIG_IGN);
if (signal (SIGTERM, termination_handler) == SIG_IGN) signal (SIGTERM, SIG_IGN);
if (DEBUG)printf(" Buferisation de la liaison série\n ");
while (1)
{
v=recopie_serie(filefd,ttyfd,buff);
close(filefd);
if ((filefd=open(nomfichier,O_CREAT | O_WRONLY|O_TRUNC))<0)
{
fprintf (stderr,"Ouverture fichier erreur %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
j=v;
j++;
if (DEBUG) printf(" valeur de v: %d \n",v);
while (j!=v)
{
write (filefd,&buff[j],1);
j++;
j%=BUFFER;
if (DEBUG) printf("%d ",j);
}
}
return EXIT_SUCCESS;
} |
Partager