如何使用boost asio

时间:2013-04-26 16:05:54

标签: c++ boost boost-asio building

我打算使用Boost Asio库来定位串口。但是,我并不完全确定如何使用它。

据我了解,asio需要构建。理论上有一个火腿构建...脚本? - 已经配置为在这种情况下使用。但是,我似乎没有构建.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序列的异常抛出(“COM1”,115200);线。错误:

boost :: exception_detail :: clone_impl&gt;在内存位置0x006DF470。

2 个答案:

答案 0 :(得分:4)

  1. 链接

    请务必链接到boost_system(用于错误子系统)。另外,请确保运行时找到的.dll与构建时使用的.lib文件完全匹配。

  2. 登录

    I suggest you add more exception detail:
    
    #include <boost/exception/diagnostic_information.hpp> 
    // ....
    
        } catch(boost::system::system_error& e)
        {
            cout<<"Error: " << e.what()<<endl;
            cout<<"Info: "  << boost::diagnostic_information(e) <<endl;
            return 1;
        }
    

    这将(在Linux上)打印"COM1:"

    Error: open: No such file or directory
    Info: Throw location unknown (consider using BOOST_THROW_EXCEPTION)
    Dynamic exception type: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >
    std::exception::what: open: No such file or directory
    

    以root用户身份运行时,或者以"/dev/tty0"的非root用户身份运行时:

    Error: open: Permission denied
    Info: Throw location unknown (consider using BOOST_THROW_EXCEPTION)
    Dynamic exception type: boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >
    std::exception::what: open: Permission denied
    

    (当然,以root身份运行/dev/tty0}时没有错误。

答案 1 :(得分:0)

您没有向我们提供太多信息,但由于cl我认为您在Windows下运行。

首先,您需要在路径中使用编译器的shell。使用Visual Studio命令提示符。检查您是否可以在提示符处拨打cl

其次是build instruction。它应该像章节5.3.1中所描述的那样简单。至少是在我尝试在Windows下构建boost时。