Bonjour,

j'écris une petite application qui utilise le port série, mais je rencontre un problème pour la lecture de celui-ci, en effet avec le code que j'utilise je ne reçoit qu'un seul caractère.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
void connect_serie::readMessage(char *buffer, unsigned int sizeMax)
{
    printf("Size : %d \n", size);
    int ret = read(fd, buffer, size);
    if (ret < 0)
    {
        perror("Error while reading");
    }
    printf("Bytes read %d :\n", ret);
}
Pourtant d'après la documentation la méthode read demande bien le pointeur de fichier, le buffer, et la taille... Je ne comprend pas pourquoi il ne lit que le premier caractère puis s'arrête.

Voici la configuration du port série :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
    // Configure port params.
    deviceConfig.c_cflag &= ~PARENB; // parity off
    deviceConfig.c_cflag &= ~PARODD;
    deviceConfig.c_cflag |= CSTOPB; // 2 stop bit.
    deviceConfig.c_cflag &= ~CSIZE; // Reset data size.
    deviceConfig.c_cflag |= CS8; // 8 data bits.
    deviceConfig.c_iflag &= ~(IXON | IXOFF | IXANY); //Disable software flow control.
 
    // Set port speed.
    cfsetispeed(&deviceConfig, B9600);
    cfsetospeed(&deviceConfig, B9600);
J'ai contourné le problème avec le code suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
void connect_serie::readMessage(char *buffer, unsigned int sizeMax)
{
 
    int i;
    int ret = 0 ;
    for ( i= 0; i < sizeMax;i++)
    {
        ret += read(fd, &buffer[i], 1);
    }
    printf("Bytes read %d :\n", ret);
}
Mais je trouve la solution peu élégante.

Dernièrement existe t-il une méthode pour lire tout le buffer d'entré ? Car je ne sais pas forcément le nombre de caractères que je reçoit sur le port série ?

Merci de votre aide