Я планирую использовать библиотеку 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.
Asio - это только заголовок, хотя, как правило, вам необходимо установить ссылку на библиотеки boost_system и boost_thread. У вас установлен boost? Какую платформу вы используете? –
В общем, вы не хотите, чтобы ваш 'io_service' был родственником объектов связи, которыми он управляет. Я бы предложил переместить 'io_service' из переменной-члена класса' SimpleSerial' и передать его конструктору. – Chad
Код был взят из ссылки в комментариях mkaes. Я мало знаю об этом. Если бы я использовал это, это был бы небольшой проект, и я сомневаюсь, что он вообще отвлечен. – 2013-04-28 12:33:42