MarJanPol Napisano Grudzień 7, 2017 Udostępnij Napisano Grudzień 7, 2017 Witam, jestem mocno początkujący i próbuję w ramach nauki stworzyć prosty programik, który będzie zapalał diodę po wciśnięciu i przytrzymaniu przycisku w RoboRemoFree i wyłączał ją po zwolnieniu przycisku. Arduino Leonardo + HC06. Wszystko podłączyłem chyba jak należy, bo łączność nawiązałem i układ "prawie" działa 🙂 przycisk w RoboRemoFree skonfigurowałem tak, że po wciśnięciu wysyła UARTem wartość 1 a po zwolnieniu wysyła wartość 0 i wgrałem taki oto programik: String odebraneDane = ""; void setup() {Serial1.begin(9600); Serial.begin(9600); pinMode (8, OUTPUT);} void loop() {if(Serial1.available() > 0) {odebraneDane = Serial1.readStringUntil('\n'); Serial.println(odebraneDane); if (odebraneDane="1") {digitalWrite (8, HIGH);} else {digitalWrite (8, LOW);}}} Niestety coś nie działa. Dioda rzeczywiście zapala się po wciśnięciu przycisku, ale już nie gaśnie po jego zwolnieniu. Jednocześnie mam podgląd w monitorze portu szeregowego i widzę, że komunikacja z RoboRemoFree działa poprawnie bo rzeczywiście po wciśnięciu na komórce przycisku widzę w okienku wartość „1” a po puszczeniu „0”. Dlaczego jednak ta wartość „0” nie przekłada się na gaszenie diody? Co jest nie tak z funkcją „if”? Musiałem zrobić jakiś głupi błąd, ale nie mogę się go doszukać... Z góry dziękuję za pomoc! Marek Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Operator przypisania "=" działa inaczej niż operator porównania "==". Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Nie mówiąc juz o tym, że w C nie ma operatora porównywania stringów. Zdecyduj się czy odpowiedź ma być jednym znakiem czy ich łańcuchem. Jeśli znakiem, to nie używaj ograniczników "" a jeśli łańcuchem, to strcmp(). Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Nie mówiąc juz o tym, że w C nie ma operatora porównywania stringów. Zdecyduj się czy odpowiedź ma być jednym znakiem czy ich łańcuchem. Jeśli znakiem, to nie używaj ograniczników "" a jeśli łańcuchem, to strcmp(). Ale to nie jest C, tylko Arduino i to nie jest char* tylko String. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
ethanak Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Nie Arduino tylko C++ (to tak w kwestii formalnej). Czyli dla klasy String jest zdefiniowany operator porównania, również z const char*. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Nie Arduino tylko C++ (to tak w kwestii formalnej). Nie C++ tylko Arduino. Tak w kwestii formalnej. Wiem co piszę, klasa String w "dorosłym" C++ jest trochę inna, ta w Arduino jest nieco uproszczona. Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 To jest C++, dodanie lub zmiana biblioteki nie zmienia samego jezyka. Arduino uzywa preprocesora, ale poza tym to czyste C oraz C++. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Różnica jest w bibliotekach - stdc++ versus Wiring. Nikt Ci nie broni zaimplementowania klasycznej klasy string dla Arduino, ani wiringowego Stringa pod Windowsem. Co nie zmienia faktu, że językiem jest C++, a Wiring to tylko zestaw podstawowych bibliotek (coś jak glibc versus avr-libc). Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Zanim zaczniemy filozoficzne dyskusje na temat tego co to jest język i czy dodanie biblioteki standardowej albo preprocesora zmienia język (moim zdaniem tak), to może wróćmy na chwilę na ziemię i zastanówmy się nad praktycznym znaczeniem. W tym konkretnym przypadku używamy klasy String pochodzącej z bibliotek Arduino. Stwierdzenie, że to jest C++ nie pomaga, a nawet wprowadza w błąd, bo sugeruje, że używamy klasy String z biblioteki standardowej C++, a tak nie jest. Tak, Arduino jest zbudowane na bazie C++, to wszyscy wiemy i nie trzeba tego powtarzać za każdym razem. Ale tutaj akurat to, że to nie jest jakieś zwykłe C++ tylko Arduino ma znaczenie. Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Jeśli już to nie Arduino tylko Wiring. Arduino to konkretna implementacja, a nie odrębny język. Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Moim zdaniem nazywanie Arduino odrebnym jezykiem prowadzi do wielu nieporozumien. Pozniej poczatkujacy pytaja czy powinni sie uczyc C++ czy Arduino. W przypadku embedded biblioteka standardowa bywa niedostepna, czasem niepelna, ale to nie ma wplywu na sam jezyk. Jezyk formalny ma swoja definicje - warto jej poszukac i zobaczyc ze nie zawiera sie w nim biblioteka, srodowisko, system operacyjny ani nawet kompilator. PS. sorki za brak polskich literek, to nie lenistwo ani chec stworzenia wlasnego jezyka Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Jezyk formalny ma swoja definicje - warto jej poszukac i zobaczyc ze nie zawiera sie w nim biblioteka, srodowisko, system operacyjny ani nawet kompilator. Zawierają się, tylko są razem traktowane jako czarna skrzynka i nikt nie wnika w to co jest w środku, bo matematyczna definicja języka jest bardzo ścisła i dowolna zmiana daje ci nowy język. Jeśli spróbujesz w praktyce użyć definicji języka formalnego, to zobaczysz, że nie ma czegoś takiego jak "język C++". Ba, nawet konkretna specyfikacja C++, taka jak "C++11" czy "C++17" nie jest językiem formalnym zgodnie z definicją, bo jest zbyt ogólna. Wzięcie konkretnej implementacji na konkretnym systemie operacyjnym jest już bliżej, ale nadal przecież będziesz mieć różne języki formalne tutaj w zależności od zainstalowanych bibliotek, a nawet od tego w jakim katalogu uruchomisz program albo ile pamięci RAM masz wolne. Dopiero wzięcie całego komputera w konkretnym stanie (na przykład snapshota maszyny wirtualnej) byłoby w sensie matematycznym wystarczająco precyzyjne żeby zdefiniować jeden język formalny. Prawda jest taka, że nawet kiedy mówisz "język C++" to na myśli masz "rodzinę języków" z jakąś tam w domyśle przyjętą listą cech powodującą, że dany język się do tej rodziny zalicza lub nie (na początek zgodność ze specyfikacją, na przykład). Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 To nieprawda. Dla C, C++ itd mozesz zdefiniowac gramatyke, ktora okresla jezyk. Gramatyka nie zawera informacji o bibliotece, systemie itd. https://pl.wikipedia.org/wiki/J%C4%99zyk_formalny Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 7, 2017 Udostępnij Grudzień 7, 2017 Może przeczytaj tą definicję języka formalnego jeszcze raz dokładnie. Albo może wytłumaczę łopatologicznie. Definicja: Język formalny jest definiowany za pomocą funkcji. Traktujemy tę funkcję jako czarną skrzynkę, która przyjmuje wejścia, a na wyjściu daje "tak", "nie" albo nigdy nie kończy działania. Językiem formalnym odpowiadającym naszej skrzynce nazywamy zbiór wszystkich tych wejść, na które odpowiada ona "tak". Istotne jest tutaj jednak to, że aby taka czarna skrzynka definiowała język, to musi być funkcją w sensie matematycznym, to znaczy, między innymi, że dla tego samego wejścia musi zawsze konsekwentnie dawać takie samo wyjście. Inaczej nie ma funkcji i co za tym idzie nie ma języka. No to teraz odnieśmy się do tego, co pisałeś wcześniej. Mówisz, że możesz zdefiniować dla C++ gramatykę. Pomijając takie drobiazgi, że żadna specyfikacja C++ nie zawiera formalnej definicji gramatyki, oraz że udowodniono, że to co zawiera specyfikacja nie pozawala na napisanie jednoznacznej gramatyki, zobaczmy jak to się ma do tego co robi z tymi wejściami komputer. Załóżmy, że napiszesz tą gramatykę i jakiś cudem ominiesz problemy z niejednoznacznością. Teraz bierzesz tą gramatykę i zgodnie z jej regułami generujesz program, który ma 42 petabajty wielkości. Gramatyka to dopuszcza. Ale jak spróbujesz to uruchomić na swoim komputerze, to okaże się, że on jednak zwraca błąd braku pamięci — czyli dostałeś odpowiedź "nie", podczas gdy gramatyka twierdzi, że ten program należy do języka. Zatem gramatyka, którą napisałeś, nie definiuje języka, który jest akceptowany przez twój komputer. Cytuj Link do komentarza Share on other sites More sharing options...
MarJanPol Grudzień 7, 2017 Autor tematu Udostępnij Grudzień 7, 2017 Panowie, jestem bardzo wdzięczny za Wasz aktywny udział w moim skromnym wątku 😃 ale jeśli się zgodzicie, że na chwilę wrócę do meritum i zadam pytanie pomocnicze, o to w którym dokładnie miejscu trzeba zmienić "=" na "==", bo jakoś nie jest to dla mnie takie intuicyjne. Poza tym rozumiem, że użycie zmiennej string jest nieoptymalne - czy zatem lepiej będzie zmienić linijkę: String odebraneDane = ""; na: int odebraneDane = "0"; Kłaniam się uniżenie wszystkim znawcom tematu... 😉 m. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!