0

Boost Asio ライブラリを使用してシリアル ポートをターゲットにすることを計画しています。しかし、それをどのように使用するかは完全にはわかりません。

私が理解しているように、asioを構築する必要があります。理論的には、ham ビルドがあります... スクリプトですか? - この場合に使用するためにすでに構成されています。ただし、ビルド .exe がないようです。Boost.Build をビルドすることで取得できるようです。ただし、そのビルド スクリプトの実行も失敗しました。

bootstrap.bat を実行しましたが、「cl」が見つからないという理由で失敗しました。ビルドスクリプトは同じです。

答えは簡単だと思いますが、確かではありません。ここで見た答えを試しましたが、それも失敗しました。

編集:

私の知る限り、成功裏に構築されました。私が理解しているように、asio はヘッダーのみのライブラリですが、システムはそうではありません。私の設定は、マルチスレッドの静的デバッグ用です。少しの試行錯誤とブースト ドキュメント ページを使用して、自分のコードをビルドするページを見つけました。ただし、例外がスローされます。これがライブラリの不一致なのか悪いビルドなのかはわかりません。これは、リンクされているかどうかに依存するコードの最初の行であるためです。大丈夫。

コードは次のとおりです。

//SimpleSerial.h

#include <boost/asio.hpp>

class SimpleSerial
{
public:
    /**
     * Constructor.
     * \param port device name, example "/dev/ttyUSB0" or "COM4"
     * \param baud_rate communication speed, example 9600 or 115200
     * \throws boost::system::system_error if cannot open the
     * serial device
     */
    SimpleSerial(std::string port, unsigned int baud_rate)
    : io(), serial(io,port)
    {
        serial.set_option(boost::asio::serial_port_base::baud_rate(baud_rate));
    }

    /**
     * Write a string to the serial device.
     * \param s string to write
     * \throws boost::system::system_error on failure
     */
    void writeString(std::string s)
    {
        boost::asio::write(serial,boost::asio::buffer(s.c_str(),s.size()));
    }

    /**
     * Blocks until a line is received from the serial device.
     * Eventual '\n' or '\r\n' characters at the end of the string are removed.
     * \return a string containing the received line
     * \throws boost::system::system_error on failure
     */
    std::string readLine()
    {
        //Reading data char by char, code is optimized for simplicity, not speed
        using namespace boost;
        char c;
        std::string result;
        for(;;)
        {
            asio::read(serial,asio::buffer(&c,1));
            switch(c)
            {
                case '\r':
                    break;
                case '\n':
                    return result;
                default:
                    result+=c;
            }
        }
    }

private:
    boost::asio::io_service io;
    boost::asio::serial_port serial;
};


//end SimpleSerial.h

//main.cpp

#include <iostream>
#include "SimpleSerial.h"

using namespace std;
using namespace boost;

int main(int argc, char* argv[])
{


    try {

        SimpleSerial serial("COM1",115200);

        serial.writeString("Hello world\n");

        cout<<serial.readLine()<<endl;

    } catch(boost::system::system_error& e)
    {
        cout<<"Error: "<<e.what()<<endl;
        return 1;
    }
}

//end main.cpp

SimpleSerial serial("COM1",115200); で例外がスローされます。ライン。エラー:

boost::exception_detail::clone_impl > メモリ位置 0x006DF470。

4

2 に答える 2

0

あなたは私たちに多くの情報を提供しませんが、cl私はあなたがWindowsで実行していると推測しています.

したがって、最初にパスにコンパイラを含むシェルが必要です。Visual Studio コマンド プロンプトを使用します。プロンプトでコールできることを確認しclます。

次に、ビルド手順に従います。の章で説明されているように、シンプルにする必要があります5.3.1。少なくとも、Windows の下でブーストを構築しようとしたときでした。

于 2013-04-26T16:42:00.527 に答える