Liczba postów: 9
Liczba wątków: 5
Dołączył: Aug 2017
Reputacja:
0
witam
Pomóżcie mi zrozumieć jedną rzecz, czy da się odczytać przykładowo 3 pierwsze bajty komunikatu midi i przesłać je dalej.
Czyli wpis danych z RxD do bufora i wysłanie do TxD. Nie bardzo chyba rozumiem jak kod do tego napisać bo próbuje i nic, dodatkowo doczytałem coś że jednocześnie nie mogę wpisać danych do bufora i od razu ich odczytać?
To moje początki jeśli chodzi o używanie UART.
pozdrawiam
Liczba postów: 884
Liczba wątków: 19
Dołączył: Jun 2018
Reputacja:
43
07-08-2019, 19:58
(Ten post był ostatnio modyfikowany: 07-08-2019, 20:01 przez Jarewa0606.)
(07-08-2019, 13:29)drakston napisał(a): witam
Pomóżcie mi zrozumieć jedną rzecz, czy da się odczytać przykładowo 3 pierwsze bajty komunikatu midi i przesłać je dalej.
Czyli wpis danych z RxD do bufora i wysłanie do TxD. Nie bardzo chyba rozumiem jak kod do tego napisać bo próbuje i nic, dodatkowo doczytałem coś że jednocześnie nie mogę wpisać danych do bufora i od razu ich odczytać?
To moje początki jeśli chodzi o używanie UART.
pozdrawiam
Omijaj funkcji while, do while i delay a wszystko można. Nie blokuj procesora że ma na coś czekać.
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą.
Liczba postów: 2,376
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
W Arduino jest bufor do UART poza zasięgiem użytkownika, no a przynajmniej w ogólnym pojęciu. Działa automatycznie, jeśli coś odczytasz to znacznik aktualnej nieodczytanej pozycji zostaje przesunięty na nieodczytany znak, więc inna funkcja wracając z innego miejsca programu do tego bufora zostanie skierowana na kolejne nieodczytane dane, te odczytane dalej tam mogą być, ale są tak jakby już skasowane (są dalej w tej tablicy o ile nie zostały nadpisane nowymi). Ale nie ingerując w ten mechanizm możesz zrobić swój bufor, do niego odczytywać wszystko, to co z pozycji 0-2 odczytać jedną funkcją, a drugą całość i dopiero wtedy oznaczyć swój bufor jako wykorzystany i gotowy do kolejnego zapisu.
Liczba postów: 2,376
Liczba wątków: 0
Dołączył: Oct 2017
Reputacja:
240
Przykład z serial event masz w Arduino IDE, zobacz jak to tam wygląda. Jak masz do odebrania ten jeden bajt to nie potrzebujesz serialEvent(), on jest po to by zebrać np. całą linię tekstu, albo określoną liczbę bajtów, więc jest tam jakaś zmienna string lub tablica gdzie wrzucasz te swoje 3 i jak tyle nazbierasz to sygnalizujesz do pętli głównej by coś z tym zrobić.
Arduino IDE -> Przykłady ->04. Komunikacja-> Serial event. Gdzieś tu na forum wrzuciłem przykład ze zbieraniem znaków aż do znaku końca linii, umieszczenie w tablicy i obróbka.
W Twoim przypadku powinieneś zebrać całą ramkę danych tego komunikatu midi, jak już znajdziesz jego koniec to wtedy w evencie ustawiasz flagę dla innej funkcji w programie, że masz cała ramkę. Ta inna funkcja bierze tą całą ramkę i wyjmuje z niej pierwsze 3 bajty, reszta do kosza. Możesz też odebrać i zapisać do tablicy 3-elementowej te pierwsze 3 bajty i resztę po prostu nie zapisywać, czekasz tylko na koniec ramki i zgłaszasz zakończenie.
Inaczej każde 3 bajty będziesz traktował jako te pierwsze. Nie wiem jak wygląda ramka midi, czy jest stała i po prostu zliczasz odebrane bajty, czy jest zmienna i jest jakiś znacznik początku i końca, czy w którymś bajcie jest podana długość danej ramki. To wszystko trzeba przeanalizować i obsłużyć w event, a gotowca przekazać do innej funkcji w loop. Wtedy w loop po prostu robisz if(ramka_gotowa==1) bierz_te_3_bajty();