Il existe plusieurs façons de procéder en général. Le meilleur choix dépend probablement du type de données que vous recherchez lorsque vous lisez le port série et de la manière dont vous souhaitez traiter les erreurs dans ces données.
La façon de poing serait d'ouvrir le fichier série pour bloquer IO et faire:
while (question) {
write(ser_fd, question.data, question.len);
sleep(1);
ioctl(ser_fd, FIONREAD, &answer.len);
answer.data = realloc(answer.data, answer.len);
read(ser_fd, question.answer, question.answer_len);
question = next(question);
answer = next(answer);
}
Bien que je ne fais pas de gestion des erreurs dans ce domaine.
Si vous voulez être en mesure d'attendre l'attente d'une réponse pour entrer dans le port série, cela change beaucoup de choses. Vous devriez utiliser soit select, pselect, poll, ppoll, soit la famille d'appels système epoll. Ceux-ci permettent à votre programme de bloquer (sommeil) jusqu'à ce que des données soient prêtes à être lues. Ensuite, vous pouvez boucler un sondage et lire jusqu'à ce que vous ayez terminé votre réponse ou que vous ayez manqué de temps.
Une autre option consiste à essayer d'utiliser SIGIO, mais je ne le recommande pas. Ce n'est pas facile de faire les choses correctement et difficile à déboguer. De plus, vous pouvez utiliser SIGALRM pour vous exclure de votre appel de lecture et agir comme un délai d'attente pour cela.
Si vous essayez d'utiliser les routines d'entrée et de sortie stdio, c'est beaucoup plus difficile. Vous serez bloqué avec quelque chose comme la première méthode sans être en mesure de demander combien de données sont prêtes.
quoi? Windows/Linux? – obelix
Votre interface série est-elle recto-verso? – NickHalden
Vous devez spécifier l'environnement d'exploitation. Les ports série ne sont pas normalisés en C, et les capacités qui affectent la bonne réponse varient d'un système à l'autre. – Darron