Skocz do zawartości
Komentator

Kurs Qt – #2 – komunikacja z Arduino przez UART

Pomocna odpowiedź

@Waldi witam na forum 🙂

Wiem, że to może być oczywiste, ale zapytam dla pewności - masz wyłączone Putty, gdy próbujesz testować program napisany w Qt?

Udostępnij ten post


Link to post
Share on other sites
Dnia 14.12.2019 o 20:29, Matthew11 napisał:

@Wrona dobrze, że o to zapytałeś bo to jest klasyczny problem, z którym spotykają się ludzie, gdy chcą dystrybuować swój program napisany w Qt. QtCreator jak uruchamia naszą aplikację to zapewnia, że wszystkie biblioteki DLL są odpowiednio podlinkowane. Jak chcemy uruchomić program z folderu to dostajemy właśnie komunikaty o braku dll-ek. 

Dla wszystkich zainteresowanych dystrybucją programów napisanych w Qt:

Generalne uwagi:

  • Najlepiej korzystać z gotowych narzędzi do dystrybucji, gdy w projekcie mamy masę plików np. qml, plików tłumaczeń, plików multimedialnych lub innych plików i korzystamy z wielu bibliotek Qt, to te narzędzia zadbają, o to aby te wszystkie pliki i biblioteki znalazły się w katalogu z naszym programem. 
  • Podczas budowania aplikacji przeznaczonej do dystrybucji, to pamiętajmy o tym, aby zbudować aplikację w trybie Release.
  • Po użyciu narzędzia do dystrybucji, dobrze jest wyczyścić projekt w celu pozbycia się zbędnych plików w katalogu, gdzie została zbudowana nasza aplikacja.
  • Wynikowy program (i wszystkie pozostałe, konieczne pliki) gotowy do dystrybucji znajdziemy w katalogu "build" (jego lokalizację znajdziemy w QtCreatorze pod przyciskiem Projekty na pasku po lewej stronie, w polu Katalog wersji). Wtedy dystrybuujemy cały katalog (Windows, Linux) lub plik .apk (Android).

Windows:
Korzystamy z narzędzia windeployqt, znajduje się ono w katalogu gdzie zainstalowaliśmy Qt i kolejno w katalogu odpowiedniego kompilatora. Musimy zwrócić uwagę jakim kompilatorem budujemy naszą aplikację, standardowo będzie to pewnie MinGW, ale istotne jest też czy budujemy aplikację 32 bitową czy 64 bitową, jak w QtCreatorze budujemy 64 bitową to przy deploy'u używamy narzędzia windeployqt z katalogu kompilatora 64 bitowego.

Przykładowo w QtCreatorze używam kompilatora MinGW 64bit, szukam katalogu gdzie zainstalowałem Qt - u mnie przykładowo:


D:\Dev\Qt\5.12.6\mingw73_64\bin

tam znajdziemy między innymi narzędzie windeployqt (znajdują się tam też inne narzędzia), jak budowałbym 32bitową aplikację to używałbym windeployqt z katalogu ..\mingw73_32\bin\

Aby uruchomić narzędzie uruchamiamy konsolę Windows (cmd, albo powershell) i przechodzimy do katalogu z narzędziem windeployqt i wywołujemy komendą:

  • dla projektu QtWidgets: 

windeployqt <path-to-app-binary> 
  • dla projektu QtQuick: 

windeployqt --qmldir <path-to-app-qml-files> <path-to-app-binary>

Dla przykładu, katalog ze źródłami projektu mam w katalogu D:\Dev\Projects\TestDesktop natomiast katalog ze zbudowanym programem (katalog "build") mam w katalogu: D:\Dev\Projects\build-TestDesktop-Desktop_Qt_5_12_6_MinGW_64_bit-Release\release i zakładam, że buduję aplikację QtQuick kompilatorem MinGW 64bit oraz zakładam, że wcześniej znalazłem się w katalogu D:\Dev\Qt\5.12.6\mingw73_64\bin wykorzystując powershell'a to wywołanie będzie takie:


.\windeployqt.exe --qmldir D:\Dev\Projects\TestDesktop D:\Dev\Projects\build-TestDesktop-Desktop_Qt_5_12_6_MinGW_64_bit-Release\release

Następnie uruchamiam program (.exe) i patrzę jakich plików dll brakuje - windeployqt nie dodaje kilku plików np:

  • libgcc_s_seh-1.dll
  • libwinpthread-1.dll
  • libstdc++-6.dll

Brakujące pliki znajdują się w folderze z narzędziem windeployqt czyli w przykładzie: D:\Dev\Qt\5.12.6\mingw73_64\bin. Należy je skopiować do folderu z programem (.exe), następnie program powinien już uruchamiać się bez problemu.

I dopiero cały katalog D:\Dev\...\release możemy już dystrybuować wraz z naszym programem.

Więcej informacji znajdziemy w dokumentacji.

Linux (Ubuntu):
Na tym samym komputerze, nie musimy robić nic z bibliotekami linkowanymi dynamicznie. Możemy program uruchomić prosto z folderu build. Gdy chcemy przenieść program na inny komputer to możemy skorzystać z narzędzia linuxdeployqt lub zobaczyć co na ten temat mówi dokumentacja.

Android:
QtCreator tworzy wynikowy plik .apk, który ma dołączone wszystkie wymagane biblioteki, więc dystrybuujemy sam instalator w postaci pliki .apk. Plik ten znajdziemy w otchłani folderu build.

 

Ostatnia najważniejsza rzecz, o której musimy pamiętać przy dystrybucji naszych programów to spełnienie wszystkich warunków licencji, z których korzystają wykorzystane przez nas biblioteki.

Witam,

Nie mogę zrobić deploymentu, bo wyskakuje mi błąd: "Unable to find the platform plugin."  To co zrobiłem po kolei wygląda następująco:

1. Uruchomiłem projekt (zielona strzałka w lewym dolnym rogu okna Qt Creatora).

2. Projekt się skompilował, zbudował i program działa bez zastrzeżeń.

3. Do utworzonego po zbudowaniu folderu przekopiowałem pliki: Qt5Core.dll, Qt5Gui.dll, Qt5SerialPort.dll, Qt5Widgets.dll.

4. Utworzyłem folder deployed (ścieżka do niego: F:\QtProjects\Forbot\deployed) i skopiowałem tam plik exe mojego projektu (pro4.exe), który powstał po zbudowaniu projektu w folderze z punktu 3.

5. Uruchomiłem Windows Power Shell i przeszedłem do podfolderu Qt, gdzie znajduje się plik windeployqt.exe

6. Wpisałem ".\windeployqt.exe F:\QtProjects\Forbot\deployed"

7. Otrzymałem odpowiedź:

F:\QtProjects\Forbot\deployed\pro4.exe 64 bit, debug executable
Direct dependencies: Qt5Core Qt5Widgets
All dependencies   : Qt5Core Qt5Gui Qt5Widgets
To be deployed     : Qt5Core Qt5Gui Qt5Widgets
Unable to find the platform plugin.

Próbowałem  już kopiować do zbudowanego folderu plik qwindows.dll, jak również cały folder platforms, ale nic to nie dało.

Zastanawia mnie też jedno. W cytowanym poście jest końcówka nazwy folderu Release, a u mnie jest Debug (build-pro4-Desktop_Qt_5_14_0_MinGW_64_bit-Debug). Być może ma to jakiś związek z moim problemem?

Pozdrawiam.

Udostępnij ten post


Link to post
Share on other sites

A może jakieś znaczenie ma fakt, że zainstalowałem wersję "for open source users"? Może nie da się robić deploymentu tylko na własny użytek?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@zwora 

Jedyna rozbieżność jaką widzę a potencjalnie może mieć znaczenie to Twoje punkty 3-5 -> po zbudowaniu projektu nie musisz nic nigdzie (na tym etapie) kopiować ręcznie. Szukasz folderu gdzie został zbudowany projekt (skąd wiem, że to jest ten katalog? a no stąd że jak spróbuje uruchomić program.exe który się tam znajduje to dostanę masę komunikatów o brakujących plikach dll - i to własnie ten katalog podaję dla windeployqt). I teraz nie kopiujesz niczego z niego ani do niego, tylko po prostu wywołujesz na tym katalogu windeployqt jak w instrukcji. Istnieje szansa ze windeployqt oprócz analizowania twojej binarki (.exe) analizuje też pozostałe pliki w tym katalogu - a Ty z katalogu gdzie zbudowałeś program skopiowałeś tylko binarkę - dlatego może występować Twój problem.

Podsumowując po punkcie 2. wywołaj windeployqt. Jeśli to również nie zadziała to pozostaje Ci szukanie problemu w sieci np. tutaj.

22 godziny temu, zwora napisał:

W cytowanym poście jest końcówka nazwy folderu Release, a u mnie jest Debug (build-pro4-Desktop_Qt_5_14_0_MinGW_64_bit-Debug). Być może ma to jakiś związek z moim problemem?

Różnica jest taka, że wersja Debug będzie wolniejsza i końcowy program (całościowo) dużo większy - przez dołączenie całego bagażu jaki niesie wersja debug. Dlatego jak dystrybuujemy programy to budujemy je w trybie Release. Jak sprawdzisz różnice w wielkości plików .dll które zostały dołączone dla obu trybów to różnica w rozmiarze może być na poziomu setek MB.

3 godziny temu, zwora napisał:

A może jakieś znaczenie ma fakt, że zainstalowałem wersję "for open source users"? Może nie da się robić deploymentu tylko na własny użytek?

Jeśli masz wersję starszą niż 5.15 to nie powinno to mieć żadnego znaczenia. Ja cały czas korzystam z wersji open source. Natomiast od wersji Qt 5.15 nastąpiły pewne zmiany, ale raczej nie powinno to mieć wpływu.

Edytowano przez Matthew11
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@zwora

Jak masz apke w Debug to spróbuj

 

.\windeplyqt.exe --debug ...

 

Edytowano przez erulission

Udostępnij ten post


Link to post
Share on other sites

Dziękuję za odpowiedzi.

Zmieniłem tryb na Release i skompilowałem znowu. Niczego nie kopiowałem, tylko po prostu przeszedłem do folderu z plikiem windeployqt.exe i wpisałem:

".\windeployqt.exe F:\QtProjects\Forbot\build-pro4-Desktop_Qt_5_14_0_MinGW_64_bit-Release\pro4.exe

I mam dalej ten sam komunikat, co wcześniej. Jak wpiszę samą ścieżkę bez nazwy pliku programu, czyli:

".\windeployqt.exe F:\QtProjects\Forbot\build-pro4-Desktop_Qt_5_14_0_MinGW_64_bit-Release

to też mam ten sam komunikat.

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@zwora Na forum Qt użytkownik mumushuiding pisze:

Cytat

解决方法:https://blog.csdn.net/mumushuiding/article/details/103728274

如果在build时选择mingw,以及打包是使用mingw下的windeployqt确实会存在这种问题。

但是若是build时选择MSVC,以及打包是使用相应的windeployqt就没问题,QT5.14版本亲测有效

Tłumacząc to w translatorze i nieco poprawiając językowo mamy:

Cytat

Rozwiązanie: https://blog.csdn.net/mumushuiding/article/details/103728274 Jeśli wybierzesz MinGW jako kompilatora i użyjesz windeployqt dla MinGW do builda, to Twój problem istnieje. Jeśli jednak wybierzesz kompilator MSVC i wersję windeployqt dla MSVC to nie będzie problemu.

Czyli teraz tak: jeśli podczas instalacji Qt wybrałeś kompilatory MinGW i MSVC jak w tym linku, to wystarczy że zmienisz projekt tak, aby budować za pomocą MSVC - albo zrobiłeś to na etapie kreatora projektu - wtedy musiałeś zaznaczyć oba kompilatory, albo możesz to zrobić w otwartym projekcie, u mnie to wygląda tak - mam aktywny kompilator GCC dla architektury x86 (mój PC), i aktywny kompilator GCC dla RPi3, żeby włączyć możliwość budowania na Androida muszę kliknąć któryś z nich powyżej tych opisanych przed chwilą (nie widać tego dobrze, ale są tam 3 różne kompilatory na tym zdjęciu):

896047141_Screenshotfrom2020-01-3116-35-06.thumb.png.9bbc2a0f9a06de9f1d0a4928359e9fe5.png

Następnie aby zmienić kompilator klikasz ikonkę komputera powyżej zielonego przycisku run i wybierasz MSVC, następnie deploy robisz jak poprzednio tylko tym razem musisz pamiętać aby użyć windeployqt dla MSVC:

1724585195_Screenshotfrom2020-01-3116-44-12.thumb.png.23e2d3f69514c798da9c50ebffe6502f.png

 

Jeśli podczas instalacji Qt NIE wybrałeś kompilatorów MinGW albo MSVC to musisz odpalić narzędzie Qt Maintenance Tool i odpowiedni kompilator doinstalować do Twojej wersji Qt, a następnie jak wyżej.

Edytowano przez Matthew11
dodanie linku do forum
  • Lubię! 1
  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dociągnąłem z użyciem Qt Maintenance Tool wersję 5.14.1 z  MSVC 2017 (w wersji 5.14.0 nie było tego kompilatora). Zmieniłem zestaw narzędzi w projekcie i skompilowałem. Przeszedłem do podfolderu bin dla nowej wersji 5.14.1 i odpaliłem:

F:\Qt\5.14.1\msvc2017_64\bin> .\windeployqt.exe F:\QtProjects\Forbot\build-pro4-Desktop_Qt_5_14_1_MSVC2017_64bit-Release\release

Teraz wszystko poszło ok. Choć tych plików w folderze release potworzyło bardzo dużo. No ale ważne, że się odpala.

 

Bardzo dziękuję za pomoc.

 

 

Edytowano przez zwora
prawdopodobnie znaleziono rozwiązanie, zatem treść posta będzie inna

Udostępnij ten post


Link to post
Share on other sites

@zwora Szybki test, jak tworzysz nowy projekt to ile masz różnych narzędzi? U mnie np:

20882301_Screenshotfrom2020-01-3117-31-40.thumb.png.93e91eb54d4a468e1a7d9725f59831f6.png

U Ciebie jeśli jest odpowiednio skonfigurowany MVSC to powinien być u Ciebie właśnie tam dostępny do wyboru. Jeśli nie jest dostępny to znaczy, że konfiguracja nie jest prawidłowa - wtedy pozostaje Ci szukanie informacji w sieci np. tutaj. Znajdziesz na ten temat mnóstwo informacji.

Jeśli masz dostępny MVSC to po prostu otwórz projekt i kliknij ikonkę "Projects", następnie jeśli w projekcie nie masz aktywnego kompilatora MVSC to kliknij go z listy - u mnie jest np dostępny kompilator dla RPi3, ale nie jest aktywny:

91208952_Screenshotfrom2020-01-3117-33-03.thumb.png.1adc0162a41e7c77f5810158664f8a85.png

jak go kliknę to stanie się aktywny:

632315349_Screenshotfrom2020-01-3117-36-08.thumb.png.40953c0037c27c5cafcd8577bedb0de8.png

Tak samo zrób u siebie z kompilatorem MVSC.

Następnie wybierz wersje kompilatora / narzędzia na które chcesz zbudować program, u mnie np. zmieniłem na kompilator, który zbuduje mi program na RPi3 - Ty powinieneś tutaj wybrać MVSC, analogiczna sytuacja u mnie:

1806508820_Screenshot2020-01-31173828.thumb.png.012449eed612ee6404df2e31b903ba11.png

Wtedy jak zbudujesz program to zostanie on zbudowany za pomocą wybranego kompilatora i na wybrane narzędzie. I wtedy możesz spróbować zrobić deploy na wersji zbudowanej przez MVSC.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
53 minuty temu, zwora napisał:

Teraz wszystko poszło ok. Choć tych plików w folderze release potworzyło bardzo dużo. No ale ważne, że się odpala.

Tak tych plików będzie sporo, a jeszcze więcej gdy budujemy projektu typu QtQuick - natomiast warto pamiętać, o tym aby po deploy przeprowadzić czyszczenie projektu, wtedy wszystkie niepotrzebne pliki (te z kompilacji) zostaną usunięte. 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

A czy to czyszczenie ma być z poziomu Qt Creatora, czy raczej komendą w terminalu (pewnie to drugie)?

Udostępnij ten post


Link to post
Share on other sites
5 godzin temu, zwora napisał:

A czy to czyszczenie ma być z poziomu Qt Creatora, czy raczej komendą w terminalu (pewnie to drugie)?

Z poziomu Qt Creatora - w drzewie projektów - klikasz na projekt PPM i klikasz Clean.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
#include <QList>
#include <QSerialPortInfo>
#include <QDateTime>
#include <QSerialPort>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->device = new QSerialPort(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButtonFind_clicked() {
    qDebug() << "Szukam urządzeń";
    QList<QSerialPortInfo> devices;
    devices = QSerialPortInfo::availablePorts();
    for(int i = 0; i < devices.count(); i++) {
   this->addToLogs("Znalazłem urządzenie: " + devices.at(i).portName() + " " + devices.at(i).description());
    ui->comboBoxDevices->addItem(devices.at(i).portName() + " " + devices.at(i).description());
    }
}

void MainWindow::addToLogs(QString message)
{
    QString currentDateTime = QDateTime::currentDateTime().toString("yyyy.MM.dd hh:mm:ss");
    ui->textEditLog->append(currentDateTime + "\t" + message);
}

void MainWindow::on_pushButtonConnect_clicked()
{
    if(ui->comboBoxDevices->count() == 0) {
      this->addToLogs("Nie wykryto żadnych urządzeń!");
      return;
    }

    QString portName = ui->comboBoxDevices->currentText().split("\t").first();
    this->device->setPortName(portName);

    if(device->open(QSerialPort::ReadWrite)) {
      this->device->setBaudRate(QSerialPort::Baud9600);
      this->device->setDataBits(QSerialPort::Data8);
      this->device->setParity(QSerialPort::NoParity);
      this->device->setStopBits(QSerialPort::OneStop);
      this->device->setFlowControl(QSerialPort::NoFlowControl);

      this->addToLogs("Otwarto port szeregowy.");
    }
    else {
      this->addToLogs("Otwarcie portu szeregowego się nie powiodło!");
    }
}

void MainWindow::on_pushButtonDisconnect_clicked()
{
    if(this->device->isOpen()) {
        this->device->close();
        this->addToLogs("Zamknięto połączenie");
    } else {
        this->addToLogs("Port nie jest otwarty");
        return;
    }
}

Mam pewien problem. Mimo poprawnego napisania aplikacji program nie chce połączyć się z arduino. Kod i zrzyt ekranu do analizy.

image.thumb.png.ccc56fdcaaa11c33e75baba0c9ccbf3e.png

Udostępnij ten post


Link to post
Share on other sites
52 minuty temu, Filip4444 napisał:

Mam pewien problem. Mimo poprawnego napisania aplikacji program nie chce połączyć się z arduino. Kod i zrzyt ekranu do analizy.

image.thumb.png.ccc56fdcaaa11c33e75baba0c9ccbf3e.png

@Filip4444 Strzelałbym, że problem leży prawdopodobnie w tym, że port pod którym masz Arduino jest już otwarty, albo system otworzył i nie zamknął go poprawie, gdy używałeś go np. do wgrania programu. Natomiast... analizując Twój zrzut ekranu widać tam, że system znalazł dwa urządzenia, a Ty nie wybrałeś portu COM3 gdzie faktycznie jest Arduino, tylko wybrałeś COM1.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...