2017-08-01 1 views
0

Zuerst bin ich kein Experte C++ - Programmierung und meine Frage könnte sehr elementar sein.Wie erstellt man einen seriellen Port mit boost :: asio und shared_ptr

Ich versuche Boost Asio zu verwenden, um auf serielle Schnittstelle zuzugreifen und shared_ptr zu verwenden, um Speicherverlust zu verhindern. Ich habe einige Beispielcodes durchsucht, aber für mich funktionieren einfach viele nicht.

mein Code ist wie folgt:

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

Compilerfehler erzeugt kompilieren:

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

Ich habe verschiedene Lösungen ausprobiert. zum Beispiel habe ich dieses zu SerialPortConnection.h hinzugefügt:

boost :: asio :: serial_port port0;

aber es funktioniert auch nicht. Es führt tatsächlich zu einem anderen Kompilierungsfehler. Jetzt muss ich wissen, wie man eine serielle Schnittstelle mit shared_ptr erstellt.

Vielen Dank,

Antwort

1

Die Antwort ist in Ihrer Fehlermeldung. no matching function for call to...

Es gibt keinen Konstruktor für serial_port, der keine Argumente benötigt. Sie müssen einen io_service weitergeben. Hier sind die Konstruktoren.

basic_serial_port documentation

So würden Sie:

port = boost::shared_ptr<serial_port_ptr>(boost::make_shared<boost::asio::serial_port>(io_service_)); 

Beachten Sie die Verwendung von 'make_shared statt new.

Und hier ist ein Beispiel, das

SerialPort class sample using boost::asio::serial_port

+0

Diese Lösung funktioniert sehr gut. Vielen Dank –

1

shared_ptr nicht notwendig ist, kompiliert. Hier ist ein Code-Snippet:

#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. 
    } 
} 

Beachten Sie, dass Boost.Asio in erster Linie ein asynchrones Modell verwendet. Es unterstützt auch synchrone Operationen, aber nicht mit einer Zeitüberschreitung (was ein dominanter Anwendungsfall ist) und es ist umständlich, dieses Verhalten nachzuahmen.

+0

Der Code wird in Zukunft erweitert und es scheint, dass eine der Lösungen für Garbage Collection shared_ptr ist. Ihre Lösung funktioniert jedoch sehr gut und in einigen anderen Projekten wird verwendet. Vielen Dank! –