質問

を使用して、シリアル ポート上の受信データ パッケージを確認したいと考えています。 boost.asio. 。各データ パケットは 1 バイト長のヘッダーで始まり、送信されたメッセージの種類を指定します。さまざまな種類のメッセージにはそれぞれ独自の長さがあります。私が書きたい関数は、新しい受信メッセージを継続的にリッスンし、メッセージを見つけたらそれを読み取り、他の関数を呼び出してそれを解析する必要があります。私の現在のコードは次のとおりです。

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);
    }
}

boost::asio::streambuf 使用する適切なツールは何ですか?また、メッセージを解析できるようにそこからデータを抽出するにはどうすればよいでしょうか?また、より頻繁に呼び出されるように、この関数のみを呼び出す別のスレッドが必要かどうかも知りたいです。高トラフィックとシリアル ポートのバッファ不足により、関数の 2 回の呼び出しの間にデータが失われることを心配する必要がありますか?GUI 用に Qt のライブラリを使用していますが、すべてのイベントを処理するのにどれくらい時間がかかるかよくわかりません。

編集: 興味深い質問は次のとおりです。シリアルポートに受信データがあるかどうかを確認するにはどうすればよいですか?受信データがない場合、関数をブロックしたくないのですが...

役に立ちましたか?

解決

この記事は、ASIO をシリアル ポートと非同期で使用する方法を理解するのに役立ちます。

更新情報 (2019-03):

私がリンクしていた元の記事はもう入手できず、インターネット アーカイブでも見つけるのが困難です。(がここにあります スナップショット。)。現在、シリアル I/O に ASIO を使用することに関する新しい記事が検索で簡単に見つかりますが、この古い記事は依然として非常に役立ちます。失われないように、公開 Gist に入れておきます。

この記事で説明されているコードはここにコピーされているようです。

作者はC++11用にアップデートしたようです。私は記事がだったと信じています 原作者 フェデ.tft.

scroll top