2017-06-18 6 views
1

Je veux utiliser asio pour lire à partir d'un périphérique série et traiter les octets lorsqu'ils sont disponibles.Comment bloquer efficacement la lecture asio jusqu'à ce que les données soient disponibles sur le périphérique série?

Lors de l'utilisation async_read_until mon rappel est appelé la plupart du temps en raison de l'erreur de fin de fichier (EOF). Je dois donc quitter le rappel et l'enregistrer à nouveau jusqu'à ce que les données soient disponibles. Il en résulte une boucle occupée, que je voudrais empêcher. Similaire arrive à read_until qui revient immédiatement avec la même erreur EOF.

Pour POSIX, il est poll d'attendre efficacement jusqu'à ce que les données soient disponibles sur un périphérique, mais je préfère utiliser des fonctions asio portables (y compris Windows) pour obtenir un effet similaire. Sur asio il y a asio::descriptor_base::bytes_readable qui me permettrait de tester au préalable si les données sont disponibles, cependant je devrais tester ceci dans une boucle active pour bloquer jusqu'à ce que les données soient disponibles.

Existe-t-il un moyen pour asio d'appeler seulement un rappel asynchrone lorsque les données sont disponibles? Par exemple. puis-je masquer les erreurs dans async_read_until de sorte que les rappels ne sont pas appelés sur ces erreurs?

+1

Peut-être que vous cherchez http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/overview/core /reactor.html – sehe

Répondre

0

Si vous voulez lire les données quand elles sont disponibles, je vous recommande d'utiliser la fonction async_read_some au lieu de async_read_until, voir Streams, Short Reads and Short Writes.

Un gestionnaire de lecture typique ressemblerait à ceci:

void read_handler(const boost::system::error_code& error, size_t bytes_transferred) 
{ 
    if (error != boost::asio::error::operation_aborted) 
    { 
    if (error) 
     // handle error 
    else 
    { 
     // process bytes_transferred data from the buffer 
     // enable reception by calling async_read_some on the socket with a buffer 
    } 
    } 
}