You are not logged in.
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.
Offline
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
Offline