を使用して、シリアルポートで受信データパッケージを確認したいと思います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のライブラリを使用していますが、すべてのイベントを処理するのにどれくらいの時間がかかるのか本当にわかりません。
編集:興味深い質問は、シリアルポートに着信データがあるかどうかを確認するにはどうすればよいですか?着信データがない場合、関数をブロックしたくありません...