Skocz do zawartości
Komentator

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.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites

Elvis, Chumanista,

Panowie, dziękuję za odpowiedzi i przepraszam za takie pytania. Ale jeżeli chcę coś robić z tym Arduino, to muszę się wgłębiać w takie detale 🙂

Pozdrawiam MrShadow

Udostępnij ten post


Link to post
Share on other sites

Mam pytanie, czy na arduino leonardo też powinien działać ten program z "Interakcja z programem", chodzi mi dokładnie o te instrukcje zagnieżdżone if?

Udostępnij ten post


Link to post
Share on other sites

1991piotrek, raczej tak, ale kurs pisany był na podstawie Arduino Uno i tylko na nim mogę gwarantować poprawne działanie programów. Co się dzieje w Twoim przypadku?

Udostępnij ten post


Link to post
Share on other sites

tak jak by nie widział tych drugich if-ów i nie wykonuje poleceń

[ Dodano: 04-10-2015, 21:00 ]

dobra juz mam, wina linuxa który pobiera stare oprogramowanie ( arduino 1.0.5 ) w którym nie działa zagnieżdżanie

Udostępnij ten post


Link to post
Share on other sites

Witam serdecznie

Interesuje mnie jak odczytać dane z bufora gdy wpadają do niego bez znaku końca lini (ciurkiem), a dokładnie jak wyłuskać część tych danych które są już w byforze

Krystian

Udostępnij ten post


Link to post
Share on other sites

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.

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
Share on other sites

Gal_kris, pozostaje chyba zbieranie wszystkiego do bufora i "ręczne" sprawdzanie zawartości. Nie będzie to jednak zbyt wygodne.

Udostępnij ten post


Link to post
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ą

Udostępnij ten post


Link to post
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() 🙂

Udostępnij ten post


Link to post
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

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!

Gość
Napisz odpowiedź...

×   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...