INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Anfängerproblem Serial.read Serial.write
25.09.2014, 10:27 (Dieser Beitrag wurde zuletzt bearbeitet: 25.09.2014 11:05 von trialanderror.)
Beitrag #1
Anfängerproblem Serial.read Serial.write
Hallo Forengemeinde,

ich beginne gerade damit mich in die Arduinowelt einzuarbeiten und stehe denn auch gleich vor dem ersten Problem. Mein erster Sketch sollte MIDI-Daten via USB an den Rechner schicken, verschiedene Tonleitern hoch und runter, hat wunderbar geklappt.

Beim zweiten Sketch hakt es nun aber. Wollte für den Anfang ganz simpel MIDI Notenbefehle über den USB Port empfangen und auch wieder hinausschicken (später sollen diese vor dem Senden dann auch noch verändert werden). Bitte wundert Euch nicht über die merkwürdige Baudrate, ich nutze Hairless MIDI als "Übersetzer" und dieses ist auf die gleiche eingestellt.

MIDI Befehle bestehen immer aus 3 Bytes. Habe das Problem dass nur ein Statusbyte an Hairless MIDI gesendet wird und kann mir beim besten Willen nicht erklären warum. Die Fehlermeldung lautet:

Warning: got a status byte when we were expecting 2 more data bytes, sending possibly incomplete MIDI message 0xff

Die eingehenden Statusbytes der MIDI Befehle lauten übrigens 90 bzw. 80 (HEX) für NoteOn bzw. NoteOff. Kann mir da jemand auf die Sprünge helfen? Ich doktor hier schon seit ner Stunde rum und bekomme es nicht gebacken...

Code:
byte commandByte;
byte noteByte;
byte velocityByte;
byte lastCommand;
byte lastNote;
byte lastVelocity;

void setup(){
  Serial.begin(38400);
}

void loop(){
  getMIDI();
  sendMIDI(commandByte, noteByte, velocityByte);
}

void getMIDI(){
  do{
    if (Serial.available()){
      commandByte = Serial.read();//read first byte
      noteByte = Serial.read();//read next byte
      velocityByte = Serial.read();//read final byte
    }
  }
  while (Serial.available() > 2);//when at least three bytes available
}

void sendMIDI (byte comm, byte note, byte velo){  
  if(comm != lastCommand || note != lastNote || velo != lastVelocity){
    Serial.write(comm);
    Serial.write(note);
    Serial.write(velo);
    lastCommand = comm;
    lastNote = note;
    lastVelocity = velo;
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.09.2014, 14:34
Beitrag #2
RE: Anfängerproblem Serial.read Serial.write
Habe eine Lösung gefunden die fürs erste funktioniert. Statt:

Code:
void getMIDI(){
  do{
    if (Serial.available()){
      commandByte = Serial.read();//read first byte
      noteByte = Serial.read();//read next byte
      velocityByte = Serial.read();//read final byte
    }
  }
  while (Serial.available() > 2);//when at least three bytes available
}

Code:
void getMIDI(){
    if (Serial.available() >= 3) // wait for 3-byte command packet
    {
      commandByte = Serial.read();
      noteByte = Serial.read();
      velocityByte = Serial.read();
    }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.09.2014, 02:39 (Dieser Beitrag wurde zuletzt bearbeitet: 26.09.2014 02:41 von Corvus.)
Beitrag #3
RE: Anfängerproblem Serial.read Serial.write
(25.09.2014 10:27)trialanderror schrieb:  MIDI Befehle bestehen immer aus 3 Bytes.
Das ist nicht ganz richtig. Es gibt auch zwei Befehle die nur 2 Byte lang sind.

gruß lorenz
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.09.2014, 08:52
Beitrag #4
RE: Anfängerproblem Serial.read Serial.write
(26.09.2014 02:39)Corvus schrieb:  
(25.09.2014 10:27)trialanderror schrieb:  MIDI Befehle bestehen immer aus 3 Bytes.
Das ist nicht ganz richtig. Es gibt auch zwei Befehle die nur 2 Byte lang sind.

gruß lorenz

Stimmt. Hätte heißen sollen: MIDI-Notenbefehle...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Serial auslesen > 64 Byte uk1408 18 1.031 09.03.2018 16:05
Letzter Beitrag: Tommy56
  Wieder mal einer mit serial Probs :-( Bikandajyo 13 557 03.03.2018 08:35
Letzter Beitrag: Bikandajyo
  Arduino Software Serial - Delay notwendig? Zipfel1 18 1.348 02.01.2018 11:59
Letzter Beitrag: Tommy56
  Wartet Serial.begin() auf COM-Port? tollewurst 4 888 19.08.2017 09:50
Letzter Beitrag: rkuehle
  Serial.write fraju 5 1.196 23.07.2017 21:57
Letzter Beitrag: Mathias
  Array mit Serial.read befüllen Gonmaus 4 822 01.05.2017 09:13
Letzter Beitrag: Gonmaus
  serial monitor, Ausgabe übereinander möglich?? silversurfer123 4 723 18.04.2017 19:19
Letzter Beitrag: silversurfer123
  Interrupt und Software Serial BennIY 6 1.050 29.03.2017 22:25
Letzter Beitrag: BennIY
  RGB Animation über Serial Steuern Medolino 5 1.315 20.02.2017 16:14
Letzter Beitrag: Medolino
  Serial Output Buffer abfragen BennIY 5 967 05.01.2017 18:51
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste