0

私は、絡み合わなければならないライブラリの構造に少し戸惑っています。このコンストラクトにいくつかのタイマーを導入するには、助けが必要です。

私は次のものを持っています:

  • com.hppmain含むcom.cpp
  • host.hと必要なブーストを含むcom.hppには、クラスcomClientが含まれ、定義されています。
  • host.hを含むhost.c
  • com.hppが含まれているwrapper.cppと、いくつかの必要なブースト インクルード

現在、私のcom.cppはcomClientを作成しており、それを com ポートでの非同期通信に使用しています。とを使用boost::asio::serial_portboost::asio::io_serviceます。

パケットの送信に時間がかかりすぎたときにキャッチするために、いくつかのタイマーを使用する必要があります。

comClientのインスタンスを作成するときは、パケットタイマーを初期化する必要があります。

comClientasynch_read_someのプライベート関数を使用して、 comClientのプライベート ハンドラーを呼び出します。次に、このハンドラーがhost.cの関数を呼び出します。このハンドラーは、タイマーを再起動する関数であるwrapper.cppを呼び出します。

これは、タイマーを開始する関数です。

//wrapper.cpp
void    IniPacketTimer(void *pCHandle){

    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::milliseconds(25));
    t.async_wait(&hostOnTimeout(pCHandle));
    io.run();
}

これは、要するにコマンド チェーンです。

//comClient.cpp
main{
  comClient cc();
}
//comClient.hpp
class comClient(boost::asio::io_service& io_service){
  comClient(){
   hostInit();
   aread();
  }
  private:
    aread( call aread_done)
    areaddone(call hostNewData())
}

//host.c
hostInit(){ 
   IniPacketTimer()
}
hostNewData(){
  resetTimer
}

//wrapper.cpp
resetTimer(){
  t.expires_from_now
}

質問:

シリアル ポートでの非同期読み取り/書き込み操作には影響しないが、期限に達したときに関数の実行をトリガーする非同期タイマーを提供するにはどうすればよいですか?

既存のものを使用するio_service必要がありますか、それとも別のものを作成するだけで問題ありませんか?

C2102 '&' Expects L-Value for my line というエラーが表示されるのはなぜt.async_waitですか?

4

1 に答える 1

1

問題は明確ではなく、実際のコードを投稿していないため、問題が何であるかを推測するのは非常に困難です。
特にスレッドは明確ではありませんが、asioにとっては非常に重要です。

以下は、コンパイルはするが実行しない例です。進め方のヒントになれば幸いです。
シリアルポートとタイマーを開きます。タイマーが切れるたびに、新しいタイマーが開始されます。これは、私が以前に使用したコードの削除されたバージョンなので、役立つかもしれません。

#include <boost/asio.hpp>
#include <boost/asio/serial_port.hpp>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <vector>


class SerialCommunication
{
    public:
    SerialCommunication(boost::asio::io_service& io_service, const std::string& serialPort)
        : m_io_service(io_service)
        , m_serialPort(m_io_service)
        , m_timeoutTimer(m_io_service, boost::posix_time::milliseconds(5))
    {
        configureSerialPort(serialPort);
    }

    void configureSerialPort(const std::string& serialPort)
    {
        if(m_serialPort.is_open())
        {
            m_serialPort.close();
            m_timeoutTimer.cancel();
        }
        boost::system::error_code ec;
        m_serialPort.open(serialPort, ec);
        if(m_serialPort.is_open())
        {
            // start Timer
            m_timeoutTimer.async_wait(boost::bind(&SerialCommunication::TimerExpired, this, _1));
            header_sync();
        }
    }

    void header_sync()
    {
        m_serialPort.async_read_some(boost::asio::buffer(&m_header.back(), 1),
            boost::bind(&SerialCommunication::header_sync_complete, this,
                    boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred));
    }

    void header_sync_complete(
        const boost::system::error_code& error, size_t bytes_transferred)
    {
        // stripped
        read_payload(&m_payload[0], 0);
    }


    void read_payload(uint8_t* buffer, uint8_t length)
    {
        m_serialPort.async_read_some(boost::asio::buffer(buffer, length),
            boost::bind(&SerialCommunication::payload_read_complete, this,
                    boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred));
    }

    void payload_read_complete(
        const boost::system::error_code& error, size_t bytes_transferred)
    {
        // stripped
        // timer cancel and reset
        m_timeoutTimer.cancel();
        m_timeoutTimer.expires_at(boost::posix_time::microsec_clock::local_time() +
                            boost::posix_time::milliseconds(5));
        m_timeoutTimer.async_wait(boost::bind(&SerialCommunication::TimerExpired, this, _1));
        memset(&m_header[0], 0, 3);
        header_sync();
    }

    void TimerExpired(const boost::system::error_code& e)
    {
        m_timeoutTimer.expires_at(m_timeoutTimer.expires_at() + boost::posix_time::milliseconds(5));
        m_timeoutTimer.async_wait(boost::bind(&SerialCommunication::TimerExpired, this, _1));
    }

    boost::asio::io_service& m_io_service;
    boost::asio::deadline_timer m_timeoutTimer;
    boost::asio::serial_port m_serialPort;
    std::vector<uint8_t> m_header;
    std::vector<uint8_t> m_payload;
};



int main()
{
    boost::asio::io_service io_service;
    SerialCommunication cc(io_service, "/dev/ttyS0");

    io_service.run();
    return 0;
}
于 2012-10-25T15:14:44.200 に答える