Как использовать boost asio

Я планирую использовать библиотеку Boost Asio для настройки последовательных портов. Однако я не совсем уверен, как его использовать.

Насколько я понимаю, asio нужно строить. По идее есть хам билд … скрипт? — это уже настроено для использования в этом случае. Тем не менее, у меня, кажется, нет здания .exe. По-видимому, это можно получить с помощью сборки Boost.Build. Однако запустить этот скрипт сборки также не удалось.

Я запустил bootstrap.bat, он потерпел неудачу, сославшись на то, что не может найти «cl». Сценарий сборки такой же.

Я чувствую, что ответ прост, но я не уверен. Я попробовал ответ, который видел здесь, но он также не удался.

РЕДАКТИРОВАТЬ:

Построен, насколько я знаю, успешно. Насколько я понимаю, asio — библиотека только для заголовков, а система — нет. Моя конфигурация для многопоточной статической отладки. Я, используя метод проб и ошибок, и страницу с кратким описанием документа, нашел страницу, которая создает мой код. Тем не менее, он генерирует исключения, и я не уверен, является ли это каким-то образом библиотечным несоответствием или плохой сборкой — так как это первая строка кода, которая будет зависеть от того, связана она или нет — или если мой код просто плохой и Boost работает хорошо.

Вот код:

//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> в ячейке памяти 0x006DF470.

1

Решение

  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 или от имени пользователя без полномочий root для "/dev/tty0":

    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).

4

Другие решения

Вы не даете нам много информации, но из-за cl Я полагаю, вы работаете под окнами.

Итак, сначала вам нужна оболочка с вашим компилятором в пути. Используйте командную строку Visual Studio. Проверьте, что вы можете позвонить cl на подсказку.

Второй следуйте инструкция по сборке. Это должно быть так просто, как описано в главе 5.3.1, По крайней мере, так было, когда я пытался создать boost под windows.

0