Comment puis-je mettre en œuvre timeout pour read () lors de la lecture d'un port série (C / C ++)

Je suis la lecture d'octets à partir d'un port série en C++ à l'aide d'un descripteur de fichier et la posix/unix read() fonction. Dans cet exemple, je suis de lecture de 1 octet à partir du port série (vitesse de transmission des paramètres et des approches similaires sont omis pour plus de clarté):

#include <termios.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
   int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
   char buf[1];
   int bytesRead = read(fd, buf, 1);
   close(fd);
   return 0;
}

Si le périphérique est connecté à /dev/ttyS0 ne pas envoyer de l'information, le programme se bloque. Comment puis-je définir un délai d'attente?

J'ai essayé de fixer une heure comme ceci:

struct termios options;
tcgetattr(fd, &options);
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;
tcsetattr(fd, TCSANOW, &options);

J'ai pensé qu'il était censé donner 1 seconde de délai d'expiration, mais il ne fait aucune différence. Je pense que j'ai mal compris VMIN et VTIME. Qu'est-ce que VMIN et VTIME?

Puis j'ai cherché sur le web et trouvé quelqu'un parler de la fonction select (). Est-ce la solution et si oui, comment pourrait-on l'appliquer pour le programme ci-dessus pour faire 1 seconde de délai d'attente?

Toute aide est appréciée. Merci d'avance 🙂

source d'informationauteur pvh1987