我试图通过Modbus RTU创建用于硬件控制的GUI,但是当我尝试在单独的线程中实现所有连接到串行端口和消息时,我遇到了问题。我使用Qt 5.9。 这是我的代码摘录:
some.cpp:
some::some(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::some)
{
ui->setupUi(this);
modbusH = new modbusHandler(values);
modbusThread = new QThread();
connect(modbusThread, &QThread::started, modbusH, &modbusHandler::process);
connect(modbusH, &modbusHandler::portOpenSuccess, this, on_port_opened);
connect(modbusH, &modbusHandler::portCloseSuccess, this, on_port_closed);
connect(this, &some::port_open_request, modbusH, &modbusHandler::openPort);
connect(this, &some::port_close_request, modbusH, &modbusHandler::closePort);
modbusH->moveToThread(modbusThread);
modbusThread->start();
}
void some::on_openClosePortButton_clicked()
{
emit port_open_request(ui->portsComboBox->currentText(), localBaudRate.at(ui->baudRateComboBox->currentIndex()));
}
some.h:
class some : public QMainWindow
{
Q_OBJECT
signals:
void port_open_request (QString, int);
private:
modbusHandler* modbusH;
QThread* modbusThread;
};
#endif // some_H
modbusHandler.cpp
void modbusHandler::openPort(QString portName, int baudRate)
{
device->setConnectionParameter(QModbusDevice::SerialPortNameParameter, portName);
device->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, (QSerialPort::BaudRate)baudRate);
device->connectDevice();
emit portOpenSuccess(device->state() == QModbusDevice::ConnectedState);
}
modbusHandler.h:
class modbusHandler : public QObject
{
Q_OBJECT
signals:
void sessionFinished();
void portCloseSuccess(bool ok);
void portOpenSuccess(bool ok);
public slots:
void process();
void startSession();
void openPort(QString portName, int baudRate);
void closePort();
};
#endif // MODBUSMASTER_H
第一个问题是:来自某些的信号 port_open_request 已成功连接 modbusHandler 的 openPort 插槽但是 openPort 插槽没有被执行。
我找了答案但没有结果。 QString 和 int 是注册类型。
对不起,如果有一些明显的错误:我可以在为这个问题创建裁剪版本的代码时完成。我真的试图在几天内抓住我的代码中的错误而没有任何成功。
!!! P.S。我忘了提一下,这些物体之间有一些信号槽连接,有效!例如,如果打开串口,则会发出有关它的信号,并调用某些对象的插槽。
答案 0 :(得分:0)
不确定,但规范的方法是首先将modbusH对象移动到modbusThread,然后进行连接。
您想要的连接类型是什么?对象不在同一个线程中,它不能是直接连接,因此您可以在Qt :: QueuedConnection和Qt :: BlockingQueuedConnection之间进行选择
无论如何,它需要通过事件循环才能在modbusThread的插槽中结束
我也断言连接的结果,它返回一个值得检查的bool