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:
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
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); }
Et je tombe toujours dans l'exception "no data".
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"; } } }
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.
Partager