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 monitor, Ausgabe übereinander möglich?? silversurfer123 4 125 18.04.2017 19:19
Letzter Beitrag: silversurfer123
  Interrupt und Software Serial BennIY 6 174 29.03.2017 22:25
Letzter Beitrag: BennIY
  RGB Animation über Serial Steuern Medolino 5 208 20.02.2017 16:14
Letzter Beitrag: Medolino
  Serial Output Buffer abfragen BennIY 5 216 05.01.2017 18:51
Letzter Beitrag: Tommy56
  Korrekte serial.print Befehlszeile Franz54 16 848 22.12.2016 18:37
Letzter Beitrag: renid55
  Arduino IDE Serial Plotter futsch? SensorX10 2 326 13.12.2016 13:42
Letzter Beitrag: SensorX10
  Ausgabe Serial Monitor zu viele Byt`s Hannes 0 219 12.11.2016 20:29
Letzter Beitrag: Hannes
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 405 16.09.2016 20:36
Letzter Beitrag: Datatom
  Speicher sparen bei serial.print?? DL1AKP 3 383 02.09.2016 13:32
Letzter Beitrag: hotsystems
  Serial Monitor ASCII 1 schreiben BennIY 11 853 01.08.2016 16:42
Letzter Beitrag: Mathias

Gehe zu:


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