Я планирую использовать библиотеку 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.
соединение
Обязательно укажите ссылку на boost_system (для подсистемы ошибок). Кроме того, убедитесь, что .dll
найденный во время выполнения точно соответствует .lib
файл, используемый при сборке.
логирование
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
).
Вы не даете нам много информации, но из-за cl
Я полагаю, вы работаете под окнами.
Итак, сначала вам нужна оболочка с вашим компилятором в пути. Используйте командную строку Visual Studio. Проверьте, что вы можете позвонить cl
на подсказку.
Второй следуйте инструкция по сборке. Это должно быть так просто, как описано в главе 5.3.1
, По крайней мере, так было, когда я пытался создать boost под windows.