简体   繁体   English

在另一个系统上运行时,Qt串行端口程序崩溃

[英]Qt serial port program crashes when run on another system

I modified this code on a Windows 10 PC, and it compiled and ran without crashing. 我在Windows 10 PC上修改了此代码,它编译并运行时没有崩溃。

#include <QtSerialPort/QSerialPort>

#include <QTextStream>
#include <QCoreApplication>
#include <QFile>
#include <QStringList>

QT_USE_NAMESPACE

int main(int argc, char *argv[])
{
    QCoreApplication coreApplication(argc, argv);
    int argumentCount = QCoreApplication::arguments().size();
    QStringList argumentList = QCoreApplication::arguments();

    QTextStream standardOutput(stdout);

    if (argumentCount == 1) {
        standardOutput << QObject::tr("Usage: %1 <serialportname>     [baudrate]").arg(argumentList.first()) << endl;
        return 1;
    }

    QSerialPort serialPort;
    QString serialPortName = argumentList.at(1);
    serialPort.setPortName(serialPortName);

    int serialPortBaudRate = (argumentCount > 2) ? argumentList.at(2).toInt() : QSerialPort::Baud9600;
    serialPort.setBaudRate(serialPortBaudRate);

    if (!serialPort.open(QIODevice::WriteOnly)) {
        standardOutput << QObject::tr("Failed to open port %1, error:     %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    }

    QFile dataFile("C:\\SerialCommand.dat");
    if (!dataFile.open(QIODevice::ReadOnly)) {
        standardOutput << QObject::tr("Failed to open file for reading") <<     endl;
        return 1;
    }

    QByteArray writeData(dataFile.readAll());
    dataFile.close();

    if (writeData.isEmpty()) {
        standardOutput << QObject::tr("Either no data was currently available on the standard input for reading, or an error occurred for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    }

    qint64 bytesWritten = serialPort.write(writeData);

    if (bytesWritten == -1) {
        standardOutput << QObject::tr("Failed to write the data to port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    } else if (bytesWritten != writeData.size()) {
        standardOutput << QObject::tr("Failed to write all the data to port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    } else if (!serialPort.waitForBytesWritten(5000)) {
        standardOutput << QObject::tr("Operation timed out or an error occurred for port %1, error: %2").arg(serialPortName).arg(serialPort.errorString()) << endl;
        return 1;
    }

    standardOutput << QObject::tr("Data successfully sent to port %1").arg(serialPortName) << endl;

    printf("\n\ntest");

    return 0;
}

I set Qt to release mode, and packaged the application with the following .dll files: 我将Qt设置为发布模式,并使用以下.dll文件打包了该应用程序:

  1. msvcp120d.dll msvcp120d.dll
  2. msvcr120d.dll msvcr120d.dll
  3. Qt5Core.dll Qt5Core.dll
  4. Qt5Cored.dll Qt5Cored.dll
  5. Qt5SerialPort.dll Qt5SerialPort.dll
  6. Qt5SerialPortd.dll Qt5SerialPortd.dll
  7. Qt5Widgets.dll Qt5Widgets.dll
  8. qwindows.dll qwindows.dll

When I ran the application on another system (also windows 10), the program crashes immediately - and yes, I did move SerialCommand.dat to its correct location on the C drive. 当我在另一个系统(也是Windows 10)上运行该应用程序时,该程序立即崩溃-是的,我确实将SerialCommand.dat移到了C驱动器上的正确位置。 Any thoughts? 有什么想法吗?

You're packaging the debug versions of the dlls (ending with a d ) instead of release ones. 您正在打包dll的调试版本(以d结尾),而不是发行版本。

Read the Qt deployment docs , especially the last part (from "Application Dependencies" to the end). 阅读Qt部署文档 ,尤其是最后一部分(从“ Application Dependencies”到最后)。

The dependency walker helps find the actual dependencies, and in theory windeployqt should automate the work of creating a release dir with all the files you need. 依赖关系遍历器可以帮助您找到实际的依赖关系,从理论上讲, windeployqt应该可以自动创建包含所有所需文件的发行目录。

See also this other question , but it's for an app using QML, so it's more complex than your case. 另请参见另一个问题 ,但这是针对使用QML的应用程序的,因此它比您的情况更为复杂。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM