La lecture du port série avec Boost Asio

Je veux vérifier pour la réception des paquets de données sur le port série, à l'aide de boost.asio. Chaque paquet de données va commencer avec un en-tête qui est un octet de long, et préciser quel est le type de message a été envoyé. Chaque type de message a sa propre longueur. La fonction que je veux écrire, il doit écouter les nouveaux messages entrants en permanence, et quand il en trouve un, il devrait le lire, et d'appeler une autre fonction pour l'analyser. Mon code est comme suit:

void check_for_incoming_messages()
{
    boost::asio::streambuf response;
    boost::system::error_code error;
    std::string s1, s2;
    if (boost::asio::read(port, response, boost::asio::transfer_at_least(0), error)) {
        s1 = streambuf_to_string(response);
        int msg_code = s1[0];
        if (msg_code < 0 || msg_code >= NUM_MESSAGES) {
            //Handle error, invalid message header
        }
        if (boost::asio::read(port, response, boost::asio::transfer_at_least(message_lengths[msg_code]-s1.length()), error)) {
            s2 = streambuf_to_string(response);
            //Handle the content of s1 and s2
        }
        else if (error != boost::asio::error::eof) {
            throw boost::system::system_error(error);
        }
    }
    else if (error != boost::asio::error::eof) {
        throw boost::system::system_error(error);
    }
}

Est boost::asio::streambuf le bon outil à utiliser? Et comment puis-je extraire les données à partir d'elle pour que je puisse analyser le message? Je veux aussi savoir si j'ai besoin d'avoir un thread qui appelle cette fonction, de sorte qu'il est appelé le plus souvent. Devrais-je être inquiet de perdre des données entre deux appels à la fonction en raison de la forte circulation et d'un port série du tampon de course? Je suis à l'aide de bibliothèques Qt pour l'interface graphique et je ne sais pas vraiment combien de temps il faut pour traiter tous les événements.

Edit: La question intéressante est: comment puis-je vérifier si il n'y a aucune données entrantes sur le port série? Si il n'y a pas de données entrantes, je ne veux pas la fonction pour bloquer les...

OriginalL'auteur HelloGoodbye | 2010-05-10