Bonjour tout le monde, j’aimerai pouvoir utiliser mon port RS232 afin de récupérer des trames provenant d’un capteur et de lui en envoyer. Petit problème, la communication s’effectue en mode non canonique (lecture s’effectuant par trame de longueur définie et non pas par trame terminée par un retour chariot). J’ai essayé pas mal de truc et ma configuration du port n’est toujours pas bonne.
Comment configurer correctement un port com pour s’en servir en mode non canonique 19200bds, No parity, 8 databits, 1 stopbit et pas de flow control), comment lire et écrire dessus, j’ai lu le how-to de serial programming et j’ai encore du mal.
Il y a pas à dire le mode canonique c’est largement plus sympa pour l’envoi et la réception de trames.
[code]#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define BAUDRATE B19200
#define MODEMDEVICE “/dev/ttyS0”
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
main()
{
int fd,c, res;
struct termios oldtio,newtio;
char buf_s[255];
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) {
perror(MODEMDEVICE);
exit (-1);
}
/* Configuration du port */
fcntl(fd, F_SETFL, 0);
tcgetattr(fd,&oldtio);
bzero(&newtio, sizeof(newtio));
/* mode RAW, pas de mode canonique, pas d’écho /
newtio.c_iflag = IGNBRK;
newtio.c_lflag = 0;
newtio.c_oflag = 0;
/ Controle de flux hardware /
newtio.c_cflag |= ~(CREAD | CRTSCTS);
/ 1 caractère suffit /
newtio.c_cc[VMIN] = 1;
/ Donnée disponible immédiatement /
newtio.c_cc[VTIME] = 0;
/ Inhibe le contrôle de flux XON/XOFF /
newtio.c_iflag &= ~(IXON | IXOFF | IXANY);
/ 8 bits de données, pas de parité /
newtio.c_cflag &= ~(PARENB | CSIZE);
newtio.c_cflag |= CS8;
/ Gestion des signaux modem */
newtio.c_cflag &= ~CLOCAL;
tcsetattr(fd, TCSANOW, &newtio);
while (1) {
res = read(fd,buf,255);
buf[res]=0;
printf(":%X:%d\n", buf, res);
}
printf("test\n");
tcsetattr(fd,TCSANOW,&oldtio);
}[/code]