Pages : 1
#1 Le 21/03/2013, à 17:58
- bird12358
Récupération de données en RS232
Bonjour,
je voudrais développer une application sous linux pour récupérer des données à partir d'un port RS232. J'ai donc trouvé un lien expliquant comment programme cette partie:
http://www.faqs.org/docs/Linux-HOWTO/Se … HOWTO.html
Voici mon programme:
#include <unistd.h>
#include <stdlib.h>
#include <strings.h>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#define BAUDRATE B9600
#define MODEMDEVICE "/dev/ttyUSB0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO (int status); /* definition of signal handler */
int wait_flag=TRUE; /* TRUE while no signal received */
main()
{
int fd,c, res;
struct termios oldtio,newtio;
struct sigaction saio; /* definition of signal action */
char buf[255];
__sigset_t t;
/* open the device to be non-blocking (read will return immediatly) */
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) {perror(MODEMDEVICE); exit(-1); }
/* install the signal handler before making the device asynchronous */
saio.sa_handler = signal_handler_IO;
saio.sa_mask = t;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
/* allow the process to receive SIGIO */
fcntl(fd, F_SETOWN, getpid());
/* Make the file descriptor asynchronous (the manual page says only
O_APPEND and O_NONBLOCK, will work with F_SETFL...) */
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd,&oldtio); /* save current port settings */
/* set new port settings for canonical input processing */
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
/* loop while waiting for input. normally we would do something
useful here */
while (STOP==FALSE) {
printf(".\n");usleep(10);
/* after receiving SIGIO, wait_flag = FALSE, input is available
and can be read */
if (wait_flag==FALSE) {
res = read(fd,buf,1);
buf[res]=0;
printf("received:%s:%d\n", buf, res);
if (res==1) STOP=TRUE; /* stop loop if only a CR was input */
wait_flag = TRUE; /* wait for new input */
}
}
/* restore old port settings */
tcsetattr(fd,TCSANOW,&oldtio);
}
Je récupére bien les données du RS232 mais les données ne sont pas envoyées.
Quelles erreurs j'ai faites dans mon code qui empêche l'envoie des données sur le RS232?
Si quelqu'un pouvait m'aider.
D'avance merci.
Hors ligne
#2 Le 27/03/2013, à 08:42
- mrlem
Re : Récupération de données en RS232
Je récupére bien les données du RS232 mais les données ne sont pas envoyées.
Quelles erreurs j'ai faites dans mon code qui empêche l'envoie des données sur le RS232?
Et bien, ton morceau de code ne couvre que la réception de données (avec l'appel "read"). Si tu veux que l'envoi de données fonctionne, il semble évident qu'il faille le coder... (indice : sans doute avec un appel "write" à un moment ou un autre...)
Juste un conseil : quand on copie du code, la première chose à faire avant de vouloir le modifier, c'est d'essayer de le comprendre...
Hors ligne