Vous n'êtes pas identifié.
Hello,
Je suis nouveau sur linux et je connais un peu la prog en C et j'ai un problème avec la communication RS232. J'utilise Mandrake linux 10.1 sur les 2 pc. Mon problème c'est que :
Le pc A demande à l'utilisateur une valeur x.
Le pc A envoie au pc B la valeur x.
Le pc B reçois la valeur x.
Le pc B demande à l'utilisateur une valeur.
**** ici commencent les problèmes ****
Le pc A qui est en attente sur un read reçoit qqchose avant que l'utilisateur B aie entré qqchose a envoyé (donc le write n'est pas encore fait).
Je pense donc que cela vient du buffer, je ne sais pas si c'est correcte comme je fais dans le code suivant : (la seule différence entre le code du PCA et du PCB, c'est que l'appel de fonctions send et receive est inversé.
Voici le code du pc A :
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1 /* code source conforme à POSIX */
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
volatile int DEBUG=TRUE;
volatile int fd;
volatile struct termios oldtio, SNDtio, RCVtio;
int main(void)
{
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY); // ouverture de la connexion RS232 (COM1 | read/write | pas comme terminal de controle)
if (fd < 0)
{
perror(MODEMDEVICE); // erreur à l'ouverture de la connexion
exit(-1); // quit
}
tcgetattr(fd, &oldtio); // sauvegarde de la structure de configuration courante
/* Configuration de la structure d'envoi */
bzero(&SNDtio, sizeof(SNDtio)); // vide la structure SNDtio
SNDtio.c_cflag = BAUDRATE | CRTSCTS | CS7 | PARENB | CLOCAL | CREAD; // 38400 bps | control de flux RTS/CTS (pas dans posix) | 7 bits données | parité paire | permet de garder le port ouvert malgrè une déconnexion | active le mode lecture
SNDtio.c_iflag = IGNPAR; // ignore les caractères avec erreur de parité
SNDtio.c_oflag = 0; // pas de mode de sortie particulier
/* Configuration de la structure de réception */
bzero(&RCVtio, sizeof(RCVtio)); // vide la structure RCVtio
RCVtio.c_cflag = BAUDRATE | CRTSCTS | CS7 | PARENB | CLOCAL | CREAD; // 38400 bps | control de flux RTS/CTS (pas dans posix) | 7 bits données | parité paire | permet de garder le port ouvert malgrè une déconnexion | active le mode lecture
RCVtio.c_iflag = IGNPAR; // ignore les caractères avec erreur de parité
RCVtio.c_oflag = 0; // pas de mode de sortie particulier
RCVtio.c_lflag = ECHO; // mode de lecture non-canonique avec echo
RCVtio.c_cc[VTIME] = 0; // timer inter-caractères non utilisé
RCVtio.c_cc[VMIN] = 2; // read bloquant jusqu'à ce qu'1 caractère soit lu
tcflush(fd, TCOFLUSH); // vide le tampon d'écriture
tcflush(fd, TCIFLUSH); // vide le tampon de lecture
send_serial();
//tcflush(fd, TCOFLUSH); // vide le tampon d'écriture
//tcflush(fd, TCIFLUSH); // vide le tampon de lecture
sleep(0,1);
receive_serial();
}
int send_serial(void)
{
/* Déclaration des variables */
char SNDstring[255];
//tcflush(fd, TCOFLUSH);
tcsetattr(fd, TCSANOW, &SNDtio); // affecte la configuration d'écriture
gets(SNDstring); // demande à l'utilisateur la valeur à écrire
write(fd,SNDstring,strlen(SNDstring)); // écriture de la valeur
sleep(0,1); // pause d'1/10 de sec
strcpy(SNDstring,"");
tcsetattr(fd, TCSANOW, &oldtio); // réaffectation de la configuration initiale
}
int receive_serial(void)
{
/* Déclaration des variables */
int res;
char RCVstring[255];
tcsetattr(fd, TCSANOW, &RCVtio); // affecte la nouvelle configuration
res = read(fd,RCVstring,255); // retourne après la lecture
printf("n");
printf("%in", res);
printf("%sn", RCVstring);
RCVstring[res] = 0; // 0 dans le dernier élément du tableau pour pouvoir l' imprimer...
if (DEBUG == TRUE)
{
printf("recu :%sn", RCVstring);
}
tcsetattr(fd, TCSANOW, &oldtio); // réaffectation de la configuration initiale
//tcflush(fd, TCIFLUSH);
}Merci d'avance pour votre aide.
Hors ligne
Ah, RS2323, le bon vieux temps, j'ai jamais programmé de liaison RS232 sous notre OS préféré, seulement sur des DSP et sous Win
mais je vais essayer de debugger tout ca, je te tiens au courant, ca me fera révisé, apres 6 mois de stage ca va me faire du bien ![]()
Hors ligne