2017-03-20 4 views
0

Ich habe ein Problem, das scheint jemand anderes angetroffen hat, aber scheint hier nicht gefragt werden. Ich habe eine sehr einfache einfache Anwendung, die gerade öffnet und schließt eine serielle Schnittstelle mit Boost Asio (nur versuchen, einige einfache Debuggen jetzt vor dem Bau einer größeren Anwendung zu tun. Die Anrufe befinden sich in einem qt-basierten GUI. Die serielle Kommunikation rechts jetzt wird im Fenster Konstruktor eingerichtet. es machtKann die serielle Schnittstelle nicht schließen mit Boost Asio

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    QTimer *timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), this, SLOT(getData())); 
    timer->start(1000); 

    std::string comm = "/dev/ttyUSB0"; 

    boost::asio::io_service io; 
    port = std::shared_ptr<boost::asio::serial_port>(new boost::asio::serial_port(io, comm)); 
    std::cout << "Port has been successfully opened..." << std::endl; 

    boost::asio::serial_port_base::baud_rate baud(19200); 

    port->set_option(baud); 
    std::cout << "Baud rate set to 19200..." << std::endl; 



    getData(); 
} 

getData enthält Anrufe an die serielle Schnittstelle in regelmäßigen Abständen, aber im Moment nur eine Anfrage, einen Zeitstempel auf dem gui mit der aktuellen Zeit zu füllen

Der Port ist im Destruktor

geschlossen
MainWindow::~MainWindow() 
{ 
    if (port->is_open()) port->close(); 
    delete ui; 

} 

Wenn die GUI geschlossen ist, wird der Destruktor aufgerufen, aber das System hängt nur am Schließen des Ports. Es scheint, dass es in Boost posix_mutex.hpplock Methode stecken bleibt.

Ich habe einen anderen Beitrag darüber gesehen (https://cpc110.blogspot.com/2017/03/boost-asio-can-not-close-serial-port.html), aber es scheint, dass es keine Antwort zu diesem gibt. Hat jemand darüber irgendwelche Gedanken?

Ich verwende Boost 1.58 und Qt 5.8 auf Ubuntu 16.04 LTS.

Antwort

0

Das Problem ist wahrscheinlich (ich bin ziemlich neu bei boost :: asio selbst), dass Ihr io_service bereits zerstört ist. Versuchen Sie, es zu einem Mitglied Ihrer MainWindow-Klasse zu machen.

+0

Danke für die Antwort - können Sie darauf erweitern? Warum sollte es schon zerstört sein? Da es von einem shared_ptr referenziert wird, würde ich erwarten, dass der Dienst erst nach dem Löschen von ui zerstört wird. – cirrusio

+0

Der Dienst [boost :: asio :: io_service io;] wird auf dem Stack erstellt und bei Abschluss des MainWindow-Konstruktors zerstört. Außerdem hat Qt eine eigene QSerialPort-Klasse, einen Grund, warum Sie das nicht verwenden? – ManuelH