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.

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.

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.

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.

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

  • 2 tygodnie później...

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?

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

  • 4 tygodnie później...

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

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.

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

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

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ą

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() 🙂

  • 2 tygodnie później...

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...