Bonjour,

j'ai un problème avec l'utilisation de SELECT pour lire sur un port série.

J'utilisais à la base un simple read, mais il a le désavantage d'utiliser du temps processeur pour rien.

D'après ce que j'ai compris le SELECT, permet de savoir si un port est disponible en lecture, et dès qu'il est disponible de retourner l'information. Cependant, dans mon cas, il me retourne toujours rien dans ret

Fonction de configuration:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
void ConnectSerie::start()
{
    // Next step, we connect to device through associated file and check the connection:
    m_fd = open(const_cast<char*>(m_serialAddr.c_str()), O_RDWR | O_NONBLOCK);
 
    if (m_fd == -1 )
{
        perror("Open_port: Unable to open port.");
    }
    else
    {
        printf("Port 1 has been sucessfully opened and %d is the file description\n", m_fd);
    }
 
 
    // Retrieve port params.
    if (tcgetattr(m_fd, &m_deviceConfig) != 0)
    {
        std::cout << "Error!" << std::endl;
        perror("Unable to connect");
    }
 
    cfmakeraw(&m_deviceConfig);
 
    // Set port params
    if(tcsetattr(m_fd, TCSANOW, &m_deviceConfig) != 0)
    {
        perror("error");
    }
    else
    {
        tcflush(m_fd,TCIFLUSH);
    }
 
    // With following code we send to device some bits:
    if(tcsetattr(m_fd, TCSAFLUSH, &m_deviceConfig) < 0)
    {
        perror("Error during the configuration of the serial port");
    }
 
    // Configure for select (reading).
    FD_ZERO(&m_rfds);
    FD_SET(m_fd, &m_rfds);
}
Fonction lecture :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
unsigned char ConnectSerie::readChar()
{
    unsigned char retChar;
    int ret;
    // Debug 
    printf("deb %d \n", m_tv.tv_sec);
 
    ret = select(1, &m_rfds, NULL,NULL,&m_tv);
 
    // Debug
    printf("fin : %d\n", ret);
 
    // Set data become inconsistant
    m_tv.tv_sec = m_tvBackupVal;
    m_tv.tv_usec = 0;
    FD_ZERO(&m_rfds);
    FD_SET(m_fd, &m_rfds); // Ajout 
 
    if (ret > 0)
    {
        read(m_fd, &retChar, 1);
        return retChar;
    }
    else
    {
        throw "No data";
    }
}
}
Et je tombe toujours dans l'exception "no data".

J'ai encore la configuration du port série, mais elle doit être correcte, vu que si je fais un simple code de lecture avec read() cela fonctionne. Et que je peux écrire sur le port série.

Merci de votre aide

[EDIT] J'ai ajouté deux instructions dans le code afin de re-setter l'input, car elle devenait inconsitante.