Skocz do zawartości

Matthew11

Użytkownicy
  • Zawartość

    164
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    8

Matthew11 zajął 1. miejsce w rankingu.
Data osiągnięcia: 23 lipca.

Treści użytkownika Matthew11 zdobyły tego dnia najwięcej polubień!

Reputacja

211 Mistrz

O Matthew11

  • Ranga
    5/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Kraków
  • Programuję w
    C, C++

Ostatnio na profilu byli

4943 wyświetleń profilu
  1. @dzemdobrek Twój problem nie dotyczy wgrywania programu tylko występuje już na etapie kompilacji (a dokładnie linkowania). Wygląda to na taką sytuację w której masz plik main.cpp (z funkcjami loop() i setup()) właściwego projektu i masz też drugi plik, ale o innej nazwie, który też zawiera funkcje setup() i loop(). Natomiast wadą i równocześnie zaletą PlatformIO jest to, że kompiluje on wszystkie pliki źródłowe jakie napotka w projekcie - dlatego jeśli masz taką sytuację w której przekopiowałeś pliki jednego projektu do drugiego i zmieniłeś nazwę pliku main.cpp z tego drugiego projektu to będz
  2. @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 ni
  3. Matthew11

    Tablice dynamiczne c++

    Tak jak napisał @ethanak jeśli nie będziesz zmieniał kompilatora (np. pod MSVC tego nie skompilujesz) lub nie będziesz używał flag, które wyłączają rozszerzenia (--pedantic) możesz zostawić program tak jak jest. Ja mimo wszystko użyłbym tablicy o wystarczającym do tego zadania rozmiarze - raczej jesteś w stanie określić jaki rozmiar będzie miał pakiet.
  4. Matthew11

    Tablice dynamiczne c++

    Oczywiście w zależności od przypadku użycia możemy na wszystko odpowiedzieć "to zależy". Natomiast w tym konkretnym przypadku - czyli zapisywaniu odebranych danych w jakimś buforze - prawdopodobnie najlepszą opcją pozostaje skorzystanie ze statycznego bufora. Nie mniej kiedy, nie mamy innej możliwości i pozostaje tylko dynamiczna alokacja pamięci i dodatkowo mamy dostępny C++11 wtedy inteligentne wskaźniki są według mnie bezpieczniejszą opcją niż użycie naked new/delete (czy malloc/free) - mniej wycieków pamięci i mniej problemów z ręcznym jej zwalnianiem.
  5. Matthew11

    Tablice dynamiczne c++

    Jak mówimy o C++ i kompilator ma dostępny C++11 to możemy wykorzystać dobrodziejstwa smart pointerów (a konkretnie std::unique_ptr) do dynamicznej alokacji, żeby potem nie musieć ręcznie zwalniać pamięci. auto charArray = std::unique_ptr<char[]>(new char[10]); std::unique_ptr ma metodę get(), która zwraca klasyczny wskaźnik do zaalokowanego zasobu. Pełny przykład: #include <memory> #include <iostream> class Test { public: Test() { std::cout << "ctor\n"; } ~Test() { std::cout << "dtor\n"; } }; int main() { auto testArray = std::uni
  6. Jeśli jakieś biblioteki załóżmy, że jedna z nich to będzie SoftwareSerial i będzie jeszcze jakiś HardwareSerial i BetterSerial to jeżeli każda z nich dziedziczy po jakieś klasie strumienia np. arduinowy Stream to wtedy Ty w swojej bibliotece/programie, możesz bazować na interfejsie (tak się na to ładnie mówi) jaki daje klasa Stream. Wtedy: class Test // BasedOnStream { public: Test(Stream& stream): m_stream{stream} {} private: Stream& m_stream; }; Jednym z ograniczeń jest to, że do dyspozycji masz tylko metody klasy Stream. I nie będziesz mógł korzystać z jakiś specja
  7. Na dwa sposoby, wskaźnikiem lub referencją. Najbezpieczniej za pomocą referencji i w konstruktorze klasy np.: class Test { public: Test(SoftwareSerial& softwareSerial): m_softwareSerial{softwareSerial} {} private: SoftwareSerial& m_softwareSerial; }; Albo rzeczonym wskaźnikiem: class Test { public: Test(SoftwareSerial* const softwareSerial): m_softwareSerial{softwareSerial} {} private: SoftwareSerial * const m_softwareSerial; }; * const po to żeby nie zrobić sobie krzywdy np. w ten sposób: m_softwareSerial++; Zastosowanie: SoftwareSerial s
  8. Rozumiem, że nie chcesz uzależnić biblioteki od funkcji w kodzie głównym, tylko przekazać tą funkcje z kodu głównego do biblioteki. Jeśli tak to rozwiązań jest w sumie dwa - pierwsze z użyciem wskaźników na funkcje (C style), drugie z wykorzystaniem std::function (modern C++ style). #include <functional> #include <iostream> class Test { public: Test(std::function<void(void)> callbackOne, void (*callbackTwo)()) : m_callbackOne{callbackOne}, m_callbackTwo{callbackTwo} { } void call() { m_callbackOne(); m_callbackTwo(); } private:
  9. @MateoS07 W takiej formie jak w kursie (klasy przeznaczone do BT Classic) zapewne nie połączysz się z tym modułem - ale nie zaszkodzi sprawdzić analizując ewentualne błędy raportowane przez biblioteki Qt. Wypróbuj też aplikację BLE Scanner (Scan, Connect, Find Lost BLE Devices) powinna Ci ona podpowiedzieć co Twój moduł oferuje. BLE opiera swoje działanie o usługi i charakterystyki (services and characteristics) - więcej o tym w tym poradniku - a przeglądając dokumentację Twojego modułu można tam doszukać się informacji o czymś podobnym. Ciebie zapewne interesuje usługa o nazwie UAR
  10. @jugan1 masz rację co do tego, że wykorzystanie qDebug() opóźnia emisję sygnału - jak każda operacja I/O w programie, a taką jest użycie qDebug(). Nie mniej to opóźnienie jest na tyle małe, że nie ma wpływu - należałoby to sprawdzić, ale pewnie doliczenie do 100'000 generuje "większe opóźnienie" niż wywołanie qDebug(). Możesz usunąć tę linię kodu i sprawdzić jak wtedy działa program - nie powinno być żadnej różnicy (przynajmniej na moim sprzęcie nie ma). To co tutaj "robi robotę" to wyłącznie to, że heavyCalculations() nie jest wykonywane w wątku GUI - dzięki czemu pętla for nie blokuje
  11. Pewnego pięknego razu zdecydowaliśmy w firmie, że argumenty funkcji i zmienne lokalne nazywamy właśnie od _ i... do dzisiaj żałuję tej decyzji. Gdyby tyczyło się to tylko memberów to byłoby to na plus. Ale gdy mowa o argumentach i zamiennych lokalnych to po prostu dodaliśmy sobie pracy. Dlatego obecnie jestem za szkołą m_ i tylko do memberów a wszystko inne bez żadnych dodatków.
  12. Albo konsekwentne stosowanie jakiegoś standardu nazewnictwa. @farmaceuta można się spotkać z zapisem, że zmiennym w klasach dodaje się przedrostek m_ (member) i wtedy czytając kod łatwo jest odróżnić członków klasy od argumentów czy zmiennych lokalnych.
  13. Jeśli chodzi o prywatne biblioteki, to tak umieszczasz je w lib. Rozumiem, że chodzi Ci o dodatkowe biblioteki (poza tymi dostarczonymi w ramach toolchainu), które instalujesz za pomocą Arduino IDE? Wtedy odpowiedź brzmi - tak. Platformio rozumie to jako specyficzne dla projektu bądź prywatne: This directory is intended for project specific (private) libraries. To jak powinna być zdefiniowana struktura plików takich bibliotek masz opisane dokładnie w README w katalogu lib jak stworzysz nowy projekt. Natomiast jeśli chodzi Ci o np. bibliotekę SPI - czyli driver dostarczony w
  14. @Gieneq Wrzuciłem funkcje smaller* do CompilerExplorer - link do mojego testu - i w wynikowym asemblerze możemy zobaczyć że już przy O1 kod funkcji smaller_v1, smaller_v2 i smaller_v3 generują ten sam kod maszynowy, z kolei smaller_v4 generuje kod maszynowy który ma dwie instrukcje więcej niż pozostała trójka. Do testu wziąłem output z STM32CubeIDE: arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m4 -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32L476xx -c -I../Core/Inc -I../Drivers/STM32L4xx_HAL_Driver/Inc -I../Drivers/STM32L4xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/
  15. @_LM_ Wszystko dokładnie masz opisane w plikach README.md każdego katalogu, który tworzy PIO po stworzeniu nowego projektu. include - tam dodajesz nagłówki ze swoim kodem czyli np. common.h src - tam masz main.cpp i tam byś np. dodał common.c lib - tam umieszczasz swoje prywatne biblioteki (nie musi to być biblioteka w rozumieniu biblioteki, ale np. jakiś moduł, który z Twojego punktu widzenia można wykorzystywać jako niezależny element w wielu projektach) w Twoim przypadku tam mogły by prawdopodobnie wlecieć pliki ATcmd.c i ATcmd.h - według wymagań opisanych w README.md
×
×
  • 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.