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
geschlossenMainWindow::~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.hpp
lock
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.
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
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