如何通过boost::asio和shared_ptr创建串行端口
How to create a serial port by boost::asio and shared_ptr
起初,我不是一个专业的c++编程,我的问题可能很初级。
我正在尝试使用boost asio访问串行端口并使用shared_ptr来防止内存泄漏。我搜索了一些示例代码,但对我来说,其中许多不起作用。
我的代码如下:
串行端口连接.cpp:
#include "SerialPortConnection.h"
SerialPortConnection::SerialPortConnection( std::string port_name_init, int baud_rate_init,
boost::asio::serial_port_base::character_size charSize_init,
boost::asio::serial_port_base::stop_bits stopBit_init,
boost::asio::serial_port_base::parity pariy_init,
boost::asio::serial_port_base::flow_control flowControl_init) :
port_name(port_name_init),
baud_rate(baud_rate_init),
charSize(charSize_init),
stopBit(stopBit_init),
pariy(pariy_init),
flowControl(flowControl_init)
{
port = boost::shared_ptr<serial_port_ptr>( new boost::asio::serial_port );
}
SerialPortConnection::~SerialPortConnection()
{
//dtor
}
SerialPortConnection.h:
#ifndef SERIALPORTCONNECTION_H
#define SERIALPORTCONNECTION_H
#include <iostream>
#include <string>
#include <memory>
#include <boost/asio.hpp>
#include <boost/asio/serial_port.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/make_shared.hpp>
//using namespace::boost::asio;
class SerialPortConnection
{
public:
SerialPortConnection( std::string port_name_init, int baud_rate_init,
boost::asio::serial_port_base::character_size charSize000_init,
boost::asio::serial_port_base::stop_bits stopBit000_init,
boost::asio::serial_port_base::parity pariy000_init,
boost::asio::serial_port_base::flow_control flowControl_init );
virtual ~SerialPortConnection();
private:
std::string port_name;
int baud_rate;
boost::asio::serial_port_base::character_size charSize;
boost::asio::serial_port_base::stop_bits stopBit;
boost::asio::serial_port_base::parity pariy;
boost::asio::serial_port_base::flow_control flowControl;
boost::asio::io_service io;
typedef boost::asio::serial_port* serial_port_ptr;
boost::shared_ptr < serial_port_ptr > port;
};
#endif // SERIALPORTCONNECTION_H
编译器创建编译错误:
||=== Build: Debug in test-1 (compiler: GNU GCC Compiler) ===|
/home/mkh/cb-codes/test-prjs/test-1/src/SerialPortConnection.cpp||In constructor ‘SerialPortConnection::SerialPortConnection(std::__cxx11::string, int, boost::asio::serial_port_base::character_size, boost::asio::serial_port_base::stop_bits, boost::asio::serial_port_base::parity, boost::asio::serial_port_base::flow_control)’:|
/home/mkh/cb-codes/test-prjs/test-1/src/SerialPortConnection.cpp|17|error: no matching function for call to ‘boost::asio::basic_serial_port<>::basic_serial_port()’|
/usr/include/boost/asio/basic_serial_port.hpp|147|note: candidate: boost::asio::basic_serial_port<SerialPortService>::basic_serial_port(boost::asio::basic_serial_port<SerialPortService>&&) [with SerialPortService = boost::asio::serial_port_service]|
/usr/include/boost/asio/basic_serial_port.hpp|147|note: candidate expects 1 argument, 0 provided|
/usr/include/boost/asio/basic_serial_port.hpp|126|note: candidate: boost::asio::basic_serial_port<SerialPortService>::basic_serial_port(boost::asio::io_service&, const native_handle_type&) [with SerialPortService = boost::asio::serial_port_service; boost::asio::basic_serial_port<SerialPortService>::native_handle_type = int]|
/usr/include/boost/asio/basic_serial_port.hpp|126|note: candidate expects 2 arguments, 0 provided|
/usr/include/boost/asio/basic_serial_port.hpp|105|note: candidate: boost::asio::basic_serial_port<SerialPortService>::basic_serial_port(boost::asio::io_service&, const string&) [with SerialPortService = boost::asio::serial_port_service; std::__cxx11::string = std::__cxx11::basic_string<char>]|
/usr/include/boost/asio/basic_serial_port.hpp|105|note: candidate expects 2 arguments, 0 provided|
/usr/include/boost/asio/basic_serial_port.hpp|85|note: candidate: boost::asio::basic_serial_port<SerialPortService>::basic_serial_port(boost::asio::io_service&, const char*) [with SerialPortService = boost::asio::serial_port_service]|
/usr/include/boost/asio/basic_serial_port.hpp|85|note: candidate expects 2 arguments, 0 provided|
/usr/include/boost/asio/basic_serial_port.hpp|69|note: candidate: boost::asio::basic_serial_port<SerialPortService>::basic_serial_port(boost::asio::io_service&) [with SerialPortService = boost::asio::serial_port_service]|
/usr/include/boost/asio/basic_serial_port.hpp|69|note: candidate expects 1 argument, 0 provided|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
我已经尝试了各种解决方案。 例如,我将这个添加到SerialPortConnection.h:
boost::asio::serial_port 端口0;
但它也不起作用。它实际上会导致另一个编译错误。 现在我需要知道如何使用 shared_ptr 创建串行端口。
谢谢
shared_ptr是不必要的。这里有一个代码片段:
#include <boost/asio/serial_port.hpp>
class SerialPortConnection
{
public:
SerialPortConnection();
private:
boost::asio::io_service m_ioService; //order is important so that m_ioService gets constructed first
boost::asio::serial_port m_port;
};
SerialPortConnection::SerialPortConnection()
: m_port(m_ioService)
{
boost::system::error_code ec; // choice: without ec Boost.Asio may throw
m_port.open("COM1", ec);
if (!ec)
{
boost::asio::serial_port_base::baud_rate baud_rate1(9600);
m_port.set_option(baud_rate1);
//etc.
}
}
请注意,Boost.Asio主要使用异步模型。它也支持同步操作,但没有超时(这是一个主要的用例(,模仿这种行为很麻烦。
答案在您的错误消息中。no matching function for call to...
serial_port
没有接受零参数的构造函数。你需要通过一个io_service之类的东西。下面是构造函数。
basic_serial_port文档
所以你会:
port = boost::shared_ptr<serial_port_ptr>( boost::make_shared< boost::asio::serial_port >(io_service_));
请注意使用'make_shared
而不是new
。
这是一个编译的示例
使用boost::asio::serial_port的串行端口类示例
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 从另一个唯一 ptr 的原始 ptr 创建唯一的 ptr
- 将 lamba 隐式转换为函数 ptr 以创建类
- 使用boost lambda构造创建初始化的智能ptr的容器
- 如何创建 std::string 包装器,它将 ptr 保留为 std::string 和 ptr 到创建该包装器实例的
- ptr<Node> a = 创建对象 < 节点 > ();
- 共享Ptr与普通Ptr:声明后的对象创建