Skocz do zawartości

Kurs Qt – #2 – komunikacja z Arduino przez UART


Komentator

Pomocna odpowiedź

9 minut temu, erulission napisał:

Warto wspomnieć że instalujesz Qt 6.2 a poradnik był pisany pod Qt5. Z tego co widzę od wersji 6 moduł Serial Port jest jako osobny checkbox i nawet podejrzewam dlaczego. Na wydanie Qt 6.0 nie zdążyli wypuścić tego modułu :P. 

Osobiście nie korzystałem z wersji 6 bo na komercyjnych projektach trzymamy się 5 jako że 6 jest niestabilne a do ostatniego wydania praktycznie było nieużywalne (ze względu na brak modułów). Więc jeżeli chcesz mieć pewność że wszystko będzie działać jak w poradniku to warto zassać 5.15 🙂 

chm... odpowiedziałeś na moje pytanie zanim je zadałem. Dzięki to jest dokładnie to co chciałem wiedzieć😀 Wielkie dzięki za pomoc.

  • Lubię! 1
Link do komentarza
Share on other sites

Czy ktoś wie co robię nie tak? wszystko działa oprócz tego że nie działa. jestem w kursie na momencie w którym konfigurujemy przycisk połącz. Zwyczajnie mi nie łączy z arduino.(czy ma jakieś znaczenie że wykrywa je jako urządzenie usb?)załączam zdj z logami. i kod z mainwindow.cpp. Część nazw może się różnić ale raczej każdy się połapie, zmieniam zawsze nazwy żeby ustrzec się przed bezmyślnym przepisywaniem, dodałem przycisk czyszczenia logów dla wygody i nawet nie wiedziałem że jest on później w kursie, żeby nikt nie pomyślał że jestem właśnie przy robieniu tego przycisku.

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QSerialPortInfo>
#include <QList>
#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_pbSzukaj_clicked()
{
    this->SendMessage("Searching for devices.");
    QList <QSerialPortInfo> devices;
    devices= QSerialPortInfo::availablePorts();
    for(int i=0;i<devices.count();i++){
        ui->cbDevices->addItem(devices.at(i).portName()+" "+devices.at(i).description());
        this->SendMessage("device found: " +devices.at(i).portName()+" "+devices.at(i).description());
    }
}

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


void MainWindow::on_pbClear_clicked()
{
    ui->teLogi->clear();
}


void MainWindow::on_pbPolacz_clicked()
{

    if(ui->cbDevices->count() == 0) {
      this->SendMessage("Nie wykryto żadnych urządzeń!");
      return;
    }

    QString portName = ui->cbDevices->currentText().split("\t").first();
    this->device->setPortName(portName);
    if(!device->isOpen()) {
          // OTWÓRZ I SKONFIGURUJ PORT:
          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->SendMessage("Otwarto port szeregowy.");
          } else {
            this->SendMessage("Otwarcie porty szeregowego się nie powiodło!");
          }

    } else {
      this->SendMessage("Port już jest otwarty!");
      return;
    }

}


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

P.S.

Arduino jest chińskie

Linefollower control panel 10.11.2021 15_56_17.png

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

https://forbot.pl/blog/kurs-arduino-uart-komunikacja-z-komputerem-pc-zmienne-id3836 Tutaj masz opis działania Serial na Arduino. Generalnie to co chcemy zrobić w tym tutorialu to móc wysyłać dane z programu napisanego w Qt do Arduino. Ale żeby to robić musimy mieć program w Arduino który przynajmjniej otwiera port szeregowy 🙂 `Serial.begin(9600)` w `setup()` powinno wystarczyć do otworzenia połączenia z programem w Qt.

A przynajmniej tak mi się wydaje, dawno się tym nie bawiłem 🙂

 

Edytowano przez erulission
Link do komentarza
Share on other sites

@morteusz Udało się?

Jeśli jednak się nie udało to:

  • Sprawdź po której stronie jest problem po stronie płytki czy aplikacji - do każdej części kursu na samym jego dole jest link do pobrania gotowych programów z kursu. Zobacz czy na projekcie z kursu wszystko działa poprawnie, jeśli nie to problem jest albo w a) wersji Qt albo b) po stronie płytki.
  • Jeśli na projekcie z kursu też nie działa to użyj jakikolwiek monitor portu szeregowego np. popularny TeraTerm i zobacz czy on jest w stanie się połączyć z portem i coś wysłać lub coś odbierać z płytki.
  • Jeśli TeraTerm sobie nie poradzi to problemu trzeba szukać w płytce.
3 godziny temu, erulission napisał:

Ale żeby to robić musimy mieć program w Arduino który przynajmjniej otwiera port szeregowy 🙂 `Serial.begin(9600)` w `setup()` powinno wystarczyć do otworzenia połączenia z programem w Qt.

Jest to prawdą dla płytek, które mają natywne USB i wymagają od użytkownika jawnego włączenia modułu (może być też tak, że framework Arduino włącza go bez naszej wiedzy i takie połączenie przez USB i tak będzie działać niezależnie od tego czy wywołamy Serial.begin() czy też nie 🙃). Jeśli mówimy o poczciwym Arduino Uno, to na płytce mamy drugi mikrokontroler (ten taki malutki bliżej portu USB), który robi za konwerter USB<->UART i w takim przypadku nie ma znaczenia jaki program jest wgrany na główny mikrokontroler ani nawet to czy ten mikrokontroler jest tam fizycznie wpięty/wlutowany - bo po stronie komputera program i tak otworzy port - z tym właśnie konwerterem. Dlatego @morteusz problemem w Twoim przypadku może (ale nie musi) być to, że masz klona z jakimś tanim konwerterem.

  • Lubię! 2
Link do komentarza
Share on other sites

Odbieranie informacji od arduino działa ale nawala wysyłanie informacji do arduino. Po stronie programu zdaje się wszystko grać bo wszystkie komunikaty wyskakują i wgle ale arduino nie daje żadnego znaku że jakąkolwiek informacje otrzymało oprócz tego że jak klikam przycisk włączania diody to miga dioda rx. Czyli wygląda jakby coś było po stronie programu w arduino ide ale to zdaje się bardzo mało prawdopodobne. Mógłby ktoś pomóc?

P.S.

A i jeszcze coś takiego w ide mi wyskakuje w konsoli avrdude: jtagmkII_initialize(): Cannot locate "flash" and "boot" memories in description

Link do komentarza
Share on other sites

Przed chwilą, morteusz napisał:

że jakąkolwiek informacje otrzymało oprócz tego że jak klikam przycisk włączania diody to miga dioda rx

To wskazuje, że aplikacja wysyła dane poprawnie - skoro dioda RX miga, a to implikuje, że problem może być jednak po stronie programu na Arduino. Ja w takich sytuacjach polecam na szybko sklecić program typu "echo" (1). Czyli na Arduino każdy znak, która odbierasz odsyłasz z powrotem. Do testu weź jakikolwiek monitor portu szeregowego TeraTerm czy nawet monitor wbudowany w Arduino IDE - efekt powinien być taki, że dokładnie to samo co wyślesz powinno wrócić do monitora portu - wtedy wiesz, że Twój program na mikrokontrolerze poprawnie odbiera i wysyła dane - i dopiero wtedy można szukać dalej. 

Przed chwilą, morteusz napisał:

Czyli wygląda jakby coś było po stronie programu w arduino ide ale to zdaje się bardzo mało prawdopodobne

 Arduino IDE? Nie miałeś na myśli Arduino Uno?

(1) Czasami jak testuję np. SPI albo UART to wtedy robię "sprzętowe echo" - czyli spinam ze sobą MISO/MOSI albo TX/RX. 

  • Lubię! 1
Link do komentarza
Share on other sites

1 godzinę temu, automatyk124 napisał:

Nie wiem co robie źle, mam wrażenie jakby nie czytało #include <QSerialPortInfo> jakieś rady?

Prawdopodobnie nie kliknąłeś modułu QSerialPort przy instalacji albo nie dodałeś do pliku .pro modułu serialport.

To pierwsze rozwiążesz uruchamiając narzędzie Qt Maintenance Tool i w danej wersji Qt w podzakładce Additional Libraries kliknij Qt Serial Port. Od którejś wersji Qt dodatkowe moduły trzeba "ręcznie" wybrać przy instalacji.

  • Lubię! 1
Link do komentarza
Share on other sites

Mam zainstalowaną bilotekę zawierającą SerialCom ten sam problem jest.  

Cytat
8 godzin temu, Matthew11 napisał:

albo nie dodałeś do pliku .pro modułu serialport.

 

 

Za bardzo nie wiem o co chodzi.

Pobrałem plik z projektem z kursu żeby porównać i nie widzę różnicy w pliku.pro

Posiadam wersje 6.2.4 Community qt.

 

obraz_2022-04-05_191650957.png

Edytowano przez automatyk124
Link do komentarza
Share on other sites

36 minut temu, automatyk124 napisał:

Za bardzo nie wiem o co chodzi

Nie dodałeś importu modułu w pliku .pro. Czyli system budowania - qmake - nie wie,że ma ładować nagłówki i linkować moduł QSerialPort. 

W linii QT += core gui dodaj serialport 

Link do komentarza
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.