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
  Ausgabe Serial Monitor zu viele Byt`s Hannes 0 98 12.11.2016 20:29
Letzter Beitrag: Hannes
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 226 16.09.2016 20:36
Letzter Beitrag: Datatom
  Speicher sparen bei serial.print?? DL1AKP 3 195 02.09.2016 13:32
Letzter Beitrag: hotsystems
  Serial Monitor ASCII 1 schreiben BennIY 11 582 01.08.2016 16:42
Letzter Beitrag: Mathias
  Serial.write Mathias 6 386 29.07.2016 17:06
Letzter Beitrag: Mathias
  Serial Monitor Rudi 5 636 02.06.2016 11:37
Letzter Beitrag: Bitklopfer
  Serial.printeln, Stellen verschwinden Mathias 6 261 27.05.2016 17:44
Letzter Beitrag: Mathias
  Kommunikation Serial Monitor --> Arduino BennIY 7 357 24.05.2016 07:48
Letzter Beitrag: hotsystems
  Serial Monitor Eingabe über Code Maxi290997 4 523 12.05.2016 18:57
Letzter Beitrag: SkobyMobil
  Software serial umschaltzeit BennIY 3 384 13.03.2016 18:51
Letzter Beitrag: hotsystems

Gehe zu:


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