سؤال

أحاول الاستفادة من Qtserialport المشمولة حديثًا في QT v5.1.1 ولكني أواجه بعض المشكلات عند محاولة تجميع لي خبرة قليلة. من بحثي ، يبدو أن Qtserialport من QT 5.1 لم يتم بناؤه وجاهز للاستخدام ، هل أنا محق في هذا؟ كيف يمكنني إعداده باستخدام QT Creator أو Visual Studio 2010؟ لقد قمت مؤخرًا بالترقية من 4.8.4 ورثت المشروع ، لذا لست متأكدًا مما تم القيام به سابقًا. لقد وجدت تعليمات لتجميعها مع إصدارات Linux المختلفة ، لكن لا شيء للنوافذ يبدو متسقًا أو واضحًا ، لذلك كنت آمل أن يكون لدى شخص ما هنا بعض الإرشادات الملموسة.

شكرا لك!

تحرير: سأضيف خطأً محددًا أو اثنين أحصل عليه ، ربما سيساعد ذلك في تحديد ما أفعله خطأ.

error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall QSerialPort::metaObject(void)const " (?metaObject@QSerialPort@@UBEPBUQMetaObject@@XZ)
error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QSerialPort::QSerialPort(class QObject *)" (__imp_??0QSerialPort@@QAE@PAVQObject@@@Z) referenced in function "public: __thiscall serial_client::serial_client(class QObject *)" (??0serial_client@@QAE@PAVQObject@@@Z)

هذه ليست سوى اثنين من 21 خطأ يظهر في وقت الترجمة. كما ذكرت في التعليقات ، لا يبدو أن Visual Studio 2010 أو QT Creator يتعرفان على مكتبات Qtserialport.

هل كانت مفيدة؟

المحلول

حسنًا ، بعد تجربة مجموعة من الأشياء المختلفة وجمع المعلومات من أماكن مختلفة ، تمكنت من الحصول على كل شيء تم اكتشافه والعمل.

السبب في عدم عمله بالطبع كان بسيطًا ، ولم يتم تضمين الوحدة النمطية عبر المكون الإضافي QT5 إلى Visual Studio ، وكان هذا لسبب بسيط هو أنه لم يتم عرضه كوحدة متاحة. كانت هناك مشكلة إضافية في أنني لم أقم بتثبيت QT 5.1.1 مع تثبيت تبعيات المصدر ، فقد اخترت ببساطة التثبيت الافتراضي الذي لا يتضمن ما يحتاجه QTERIALPORT. بعد إعادة التثبيت ، قمت بتعديل إعدادات مشروع VS في الأماكن التالية:

  1. خصائص المشروع -> خصائص التكوين -> C/C ++ -> عام -> تشمل الدلائل الإضافية ، السطر المضافة: $ (qtdir) include qtserialport
  2. خصائص المشروع -> خصائص التكوين -> C/C ++ -> معالج preprocessor -> تعريفات ما قبل المعالج ، سطر إضافي: qt_serialport_lib
  3. خصائص المشروع -> خصائص التكوين -> رابط -> إدخال-> تبعيات إضافية ، سطر إضافي: qt5serialport.lib

ملاحظة: $ (qtdir) = c: qt qt5.1.1 5.1.1 msvc2010_opengl

بعد ذلك ، أضفت QT5SerialPort.dll و qt5serialportd.dll إلى مجلد الإصدار والتصحيح في مشروعي على التوالي.

أنا متأكد تمامًا من أن هذه هي التغييرات الوحيدة التي أجريتها. آمل أن يكون هذا مفيدًا لشخص آخر!

نصائح أخرى

لقد قمت بعمل مشروع صغير مع QT5.0.2 مع QSerialPort ، الذي يعمل بشكل جيد على Linux و Windows XP/7. كان تجميعها على Linux خالية من المتاعب ، حيث كانت جميع المكتبات موجودة بالفعل. لتجميعها على Windows ، استخدمت QTCreator (وليس Visual Studio) مثبتة على Windows (بدون ترجمة متقاطعة).

أولاً ، يجب عليك التحقق ، إذا تمكن QTCreator من العثور على QSerialPort ، فيجب أن تعمل بالفعل على تجميعها تحت QTCreator تحت Windows. لنشر البرنامج ، عليك التأكد من وجود جميع أجهزة QTLibraries المستخدمة. أسهل طريقة هي وضع الدليل نفسه مثل برنامجك. لبرنامجي ، يبدو هذا شيئًا من هذا القبيل:

  • +منصات (دليل مع اثنين من dlls)

    • qminimal.dll
    • qwindows.dll

    • ICUDT51.DLL

    • ICUIN51.DLL
    • ICUUC51.DLL
    • libegl.dll
    • libglesv2.dll
    • qt5core.dll
    • qt5gui.dll
    • qt5serialport.dll
    • qt5widgets.dll

يجب توخي الحذر ، أن تستخدم DLLs المستخدمة المترجم الخاص بك! 32bit مقابل 64 بت وكذلك مطابقة المترجم المستخدم (Mingw أو Visual Studio التحويل البرمجي).

قصاصة الكود لفتح منفذ التسلسلي الخاص بي:

void MainWindow::openSerialPort() 
{
struct Settings p;

/* Use name of ComPort from Combobox */
p.name = ui->cboComPort->currentText();
p.baudRate = 38400;
p.dataBits = QSerialPort::Data8;
p.parity = QSerialPort::NoParity;
p.stopBits = QSerialPort::OneStop;
p.flowControl = QSerialPort::NoFlowControl;
p.stringBaudRate = "38400";
p.stringDataBits = "8";
p.stringParity = tr("no parity");
p.stringFlowControl = tr("no flow control");
p.stringStopBits = tr("1 stopbit");

serial->setPortName(p.name);
if (serial->open(QIODevice::ReadWrite)) {
    if (serial->setBaudRate(p.baudRate)
            && serial->setDataBits(p.dataBits)
            && serial->setParity(p.parity)
            && serial->setStopBits(p.stopBits)
            && serial->setFlowControl(p.flowControl)) {

        //console->setEnabled(true);
        //console->setLocalEchoEnabled(p.localEchoEnabled);
        ui->actionConnect->setEnabled(false);
        ui->actionDisconnect->setEnabled(true);
        ui->actionConfigure->setEnabled(false);
        ui->statusBar->showMessage(tr("Connected to %1 : %2, %3, %4, %5, %6")
                                   .arg(p.name).arg(p.stringBaudRate).arg(p.stringDataBits)
                                   .arg(p.stringStopBits).arg(p.stringParity).arg(p.stringFlowControl));

    } else {
        serial->close();
        QMessageBox::critical(this, tr("Error"), serial->errorString());

        ui->statusBar->showMessage(tr("Configure error"));
    }
} else {
    QMessageBox::critical(this, tr("Error"), serial->errorString());

    ui->statusBar->showMessage(tr("Open error"));
}
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top