我使用socat创build虚拟串口:
$ socat -d -d pty,raw,echo = 0 pty,raw,echo = 0
只要用我的程序打开它,然后按Ctrl + C来停止程序,再次运行后让我这个消息:
“无法打开端口pts / 9,错误:设备或资源忙”
#include "serport.h" #include <QCoreApplication> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSerialPort serialPort; serialPort.setPortName("/dev/pts/9"); serialPort.setBaudRate(QSerialPort::Baud9600); if (!serialPort.open(QIODevice::ReadOnly)) { qDebug() << QObject::tr("Failed to open port %1, error: %2").arg(serialPort.portName()).arg(serialPort.errorString()) << endl; return 1; } serport port(&serialPort,&a); a.connect(&a, SIGNAL(aboutToQuit()), &serialPort, SLOT(deleteLater())); a.connect(&a, SIGNAL(aboutToQuit()), &port, SLOT(deleteLater())); return a.exec(); }
serport.h
#ifndef SERPORT_H #define SERPORT_H #include <QDebug> #include <QObject> #include <QtSerialPort/QSerialPort> class serport : public QObject { Q_OBJECT public: explicit serport(QSerialPort *serialPort, QObject *parent); ~serport(); QSerialPort *port; signals: public slots: }; #endif // SERPORT_H
serport.cpp
#include "serport.h" serport::serport(QSerialPort *serialPort, QObject *parent) : QObject(parent),port(serialPort){ } serport::~serport(){ qDebug()<<"closing"; port->close(); }
如何密切closures端口? 为什么在我的程序中没有看到“closures”消息?
这是关于退出进程而不调用所有的释放处理程序。 更多的特定于Linux而不是Qt。 但你仍然可以做一些事情。 确保使用Qt为Ctrl-c创建一个用户处理程序。
QApplication:如何在Ctrl-C上正常关闭
你说你自己“通过Ctrl + c停止程序”。
通过这样做,您可以向程序的进程发送一个SIGINT信号。 这种信号的典型结果[*]是终止过程,参见信号(7) 。
无论它在哪里执行,这个过程都会“死亡”。 在你的情况,最有可能在其主要的Qt事件循环。 你似乎预先假定你的程序会干净地终止,例如会自动地神奇地调用你创建的对象的所有析构函数。 这绝对不是这种情况。 serport的析构函数未被调用,因此端口未关闭。
你必须实现一种干净地终止你的程序的方式。 信号处理程序可能是一种方法。 可能有其他的/更好的,取决于你的程序在完成时的行为方式(完成代码完成)。
[*]:我说“典型”是因为许多程序(守护进程)实现了一个SIGINT处理程序,用来重新读取它们的配置文件。 这使您可以“刷新”守护程序服务器的配置,而无需停止然后重新启动它。