2013-04-26 4 views
1

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

Как я понимаю, asio необходимо построить. В теории есть сценарий ham build ...? - это уже настроено для использования в этом случае. Однако, похоже, у меня нет здания .exe. По-видимому, это можно получить, построив Boost.Build. Однако запуск сценария сборки также не удался.

У меня запущена bootstrap.bat, она не указала, что не может найти «cl». Сценарий сборки тот же.

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

EDIT:

Построенный успешно, насколько я знаю. Насколько я понимаю, 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> в ячейке памяти 0x006DF470.

+0

Asio - это только заголовок, хотя, как правило, вам необходимо установить ссылку на библиотеки boost_system и boost_thread. У вас установлен boost? Какую платформу вы используете? –

+0

В общем, вы не хотите, чтобы ваш 'io_service' был родственником объектов связи, которыми он управляет. Я бы предложил переместить 'io_service' из переменной-члена класса' SimpleSerial' и передать его конструктору. – Chad

+0

Код был взят из ссылки в комментариях mkaes. Я мало знаю об этом. Если бы я использовал это, это был бы небольшой проект, и я сомневаюсь, что он вообще отвлечен. – 2013-04-28 12:33:42

ответ

0

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

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

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

+0

Да, я нахожусь в окнах. Я следовал тому, что вы предложили, и ... казалось, что он хорошо построен в течение 40-ти минут. Однако, используя некоторый код asio, я получаю следующее: boost :: exception_detail :: clone_impl > в ячейке памяти 0x0021EE38. Я не знаю, что это значит. Это было после попытки нескольких библиотек (независимо от того, отлаживаются ли они, как связаны время выполнения и т. Д.), И это было первое, что действительно было построено. Я не знаю, что означает ошибка. – 2013-04-27 01:43:34

+0

@ Pawnguy7: Итак, я предполагаю, что у вас есть библиотеки, которые вы хотели. Вы создаете программу, и она срабатывает при ее выполнении. Звучит как ошибка в вашей программе или ссылка на неправильные библиотеки. Но это трудно сказать. – mkaes

+0

Это может быть несоответствие библиотеки, но я не уверен. Я странно не мог найти хороший тестовый код. Во всяком случае, я пытался открыть и записать в последовательный порт. Вызов port.open (первые возможные ошибки связывания) - это то место, где оно выбрано. Рядом с тем, где он ломается, это, тем не менее, похоже, связано с ... не кодом, а архитектурой или несоответствием. Заметьте, я только связываю форму системной библиотеки. На неудачных более ранних ошибках он сказал мне, что у меня многопоточная статическая отладка. #if defined (_M_X64) && defined (_NTSUBSET_) В противном случае я не смог найти правильный код для проверки, который, как я знаю, хорош. – 2013-04-27 12:33:01

4
  1. Связывание

    Обязательно ссылку на boost_system (для подсистемы ошибок). Кроме того, убедитесь, что .dll, найденный во время выполнения, точно соответствует файлу .lib, который используется при создании.

  2. Logging

    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 
    

    при запуске, как корень, или, при ее запуске некорневыми для "/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).

+0

Добавил это. Похоже на ту же ошибку, что и верхняя, хотя формулировка «не могла найти указанный файл». Выполнение в качестве администратора дает тот же результат. – 2013-04-28 23:20:14