2

boost::asio ライブラリを使用して、シリアル接続でモーターを制御しています。問題は、boost::asio::serial_port::read() 関数が、デバイスが何も送信しない場合にプログラムをフリーズさせることです。

デバイスがポートを介して通知する情報を持っているかどうかを確認するにはどうすればよいですか?

デバイスにコマンドを送信すると、問題なく応答を返すことができます。しかし、コマンドを送信せずに何かを送信したかどうかを知る方法はありますか? または、コマンドが送信されたコマンドへの応答としてのみ受信されるシリアル接続では意味がありませんか?

私のコードを確認してください

try
{
    port = new boost::asio::serial_port(io_serial, comPort.c_str());
}
char rcvd;
std::string res;
while(1)
{
    boost::asio::read(*port,boost::asio::buffer(&rcvd, 1)); //here it freezes till something is read
    std::cout<<rcvd<<std::endl; //I know it froze in the last line because nothing was written from here
    if(rcvd == '\r' || rcvd == '\0')
    {
        break;
    }
    res.push_back(rcvd);
}
return res;

ご尽力いただきありがとうございます。

4

1 に答える 1

2

シリアルポートの場合、Boost.Asioは非ブロッキング同期読み取りもタイムアウト付き読み取りも提供しません。したがって、代替オプションは非同期読み取りを使用することです。Boost.Asioがこの例を提供します。この例はTCPの例ですが、全体的な概念とタイムアウトを使用した非同期読み取りへのアプローチを例示する必要があります。

さらに、キャリッジリターンまたはNULLまでデータが読み取られる、投稿されたロジックに基づいて、などの行ベースの操作のboost::asio::async_read_until使用を検討する価値がある場合があります。

于 2013-01-25T15:17:20.203 に答える