Skocz do zawartości

Kurs Arduino - #3 - UART (komunikacja z PC), zmienne


Pomocna odpowiedź

Bool to 0 i 1 zgodnie ze specyfikacją języka C. Więc gdyby zrezygnować z Digital Write..

A właściwie gdyby zrezygnować z DigitalWrite to znika potrzeba korzystania z tych dwóch booli bo można XORować zawartość rejestru. Byłoby to jakieś 100x szybszei i idealnie przenośne.

Link do komentarza
Share on other sites

Co do szybkości, to racja. Ale z przenośnością się nie zgodzę. Przenośność polega np. na tym, że kod można bez zmian przekompilować na inne architektury, chociażby Arduino Duo (https://www.arduino.cc/en/Main/ArduinoBoardDue) - jeśli wykorzystasz rejestry, tracisz całą przenośność.

Natomiast wykorzystanie if-ów, poprawne działanie na boolean-ach oraz digitalWrite daje możliwość wykorzystania programu np. na AVR, ARM, czy PIC32.

Link do komentarza
Share on other sites

Do puki przenoszę w obrębie jednej rodziny operowanie na nazwach rejestrów będzie bardziej przenośne niż operowanie na bibliotekach Arduino które są tylko na jakieś 4 ATmegi. A przy okazji: Zdarzyło Ci się kiedyś faktycznie przenosić swój kod (w szczególności pomiędzy architekturami)? Mi jeszcze nigdy.

Link do komentarza
Share on other sites

Tak, zdarzyło mi się przenosić kod. Nawet wiele razy. Pracowałem też przy projektach, gdzie kod był pisany i uruchamiany na PC, a dopiero wersja ostateczna cross-compilowana na architekturę docelową. Możliwość abstrakcji sprzętu jest wtedy nieoceniona - na PC można napisać funkcje, które w pewien sposób emulują docelowy sprzęt. Do tego dochodzi możliwość testowania kodu - popularne od jakiegoś czasu TDD dużo łatwiej zaimplementować na PC niż na mikrokontrolerze.

W każdym razie, działanie na rejestrach to nie najlepsza praktyka, a już na pewno nie przenośna.

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

Gal_kris, co konkretnie ma robić Twój program? Jakie dane chcesz wysyłać? Jak będziesz je później interpretował skoro nie będą zawierały żadnego stałego elementu? Polecałbym raczej zająć się problemem od drugiej strony i zmienić sposób nadawania.

Zawsze możesz użyć funkcji Serial.readBytes(), ale polecam powyższe rozwiązanie.

Link do komentarza
Share on other sites

Muszę dopasować się do istniejących danych, które wyglądają tak:

01 00 FF 01 00 C7

01 00 FF 01 00 C6

01 00 FF 01 00 C6

01 00 FF 01 00 C6

01 00 FF 01 00 C6

CA 00 00

01 00 FF 01 00 C6

CA 00 00

01 00 FF 01 00 C6

CA 00 00

01 00 FF 01 00 C6

CA 00 00

01 00 FF 01 00 C6

CA 00 00

01 00 FF 01 00 C6

CA 00 00

CA 00 00 to podtrzymanie łączności, a 01 00 FF 00 C6 to wartość którą chcę wykorzystać do sterowania, dane pozyskałem akurat z takiego sznifera portu, który pozwolił mi zobaczyć które dane zmieniają się po wciśnięciu guzika.

Gdybym wiedział jak odczytać tylko 1 i 3 segnent czyli 01 00 FF 01 00 C6 to już prawie osiągnę to co chce zrobić

odwołałem się do tego programu, bo na nim mogę to testować:

#define zielona 8
#define czerwona 9

String odebraneDane = ""; //Pusty ciąg odebranych danych

void setup() {
 Serial.begin(9600); //Uruchomienie komunikacji
 pinMode(zielona, OUTPUT); //Konfiguracja wyjść
 pinMode(czerwona, OUTPUT);

 digitalWrite(zielona, LOW); //Wyłączamy diody
 digitalWrite(czerwona, LOW);
}

void loop() {
 if(Serial.available() > 0) { //Czy Arduino odebrano dane
   //Jeśli tak, to odczytujemy je do znaku końca linii i zapisz w zmiennej odebraneDane
   odebraneDane = Serial.readStringUntil('\n'); 

   if (odebraneDane == "zielona") { //Jeśli odebrano słowo "zielona"
     digitalWrite(zielona, HIGH); //To włączamy diodę zieloną
     delay(1000);
     digitalWrite(zielona, LOW); 
   }

   if (odebraneDane == "czerwona") { //Jeśli odebrano słowo "czerwona"
     digitalWrite(czerwona, HIGH); //To włączamy diodę czerwoną
     delay(1000);
     digitalWrite(czerwona, LOW); 
   }
 }
}

z tym że ten program nie rozpoznaje danych bez znaku nowej lini

GAL

Link do komentarza
Share on other sites

A odczyt z bufora ostatnich 17 znaków??

czy nie istnieje żadna funkcja porównująca w locie to co ma we wzorcu? czy bufor jest potrzebny do porównań?

pytam bo nie ogarniam jeszcze tego tematu, no bo zielonym jestem programistą

Link do komentarza
Share on other sites

Gal_kris, najlepiej będzie, jak do tymczasowego bufora będziesz zapisywał każdy oczytany bajt, a następnie będziesz w pętli while skanował odebrane dane. Zajrzyj do dokumentacji funkcji Serial.readBytes() 🙂

Link do komentarza
Share on other sites

Witam

Niedawno zainteresowałem się arduino.

Kurs bardzo fajny i konkretny.

Kombinuje z programem informującym o otwarciu okna.

Chciałem zrobić to z 2 "czujnikami otwarcia" (włącznikami).

Z sygnalizacją diodami nie ma problemu.

Problem pojawia się gdy chcę aby wpisywał jednokrotnie informację do monitora portu szeregowego.

W jaki sposób to zrobić??

Pozdrawiam

Konrad

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.