• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
MIDI pętla
#1
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
 
Odpowiedź
#2
(07-08-2019, 13:29)drakston napisał(a): bardzo chyba rozumiem jak kod do tego napisać bo próbuje i nic
Pokaż te próby.

(07-08-2019, 13:29)drakston napisał(a): dodatkowo doczytałem coś że jednocześnie nie mogę wpisać danych do bufora i od razu ich odczytać?
Jak masz jeden rdzeń to równocześnie możesz robić tylko jedną operację. Nawet gdy rdzeni jest kilka, w tej samej chwili nie da się czytać i pisać do uart, jeden z rdzeni będzie czekał.
To co chcesz zrobić najlepiej zrobić na przerwaniach. W nich możesz odczytany znak i wpisywać do bufora nadawczego.
 
Odpowiedź
#3
(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ą. 
 
Odpowiedź
#4
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.
 
Odpowiedź
#5
ok udało mi się to wykonać z pomocą przykładu na jakiejś zagranicznej stronie i wykorzystanie serialevent. Czyli jak dobrze rozumiem w funkcji serialEvent jest własnie działanie na przerwaniu?

Czy jest gdzieś możliwość podejrzenia jak ta funkcja serialEvent jest napisana w arduino?

Kod:
boolean byteReady;
unsigned char midiByte;

void setup() {
    Serial.begin(31250);
    byteReady = false;
    midiByte = 0; 
}


void loop() {
   if (byteReady) {
        byteReady = false;
        Serial.write(midiByte);
    }
}


void serialEvent() {
  if (Serial.available()) {
    // get the new byte:
    midiByte = (unsigned char)Serial.read();
    byteReady = true;
  }
}
 
Odpowiedź
#6
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();
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości