2

DMXソフトウェア用のArduinoインターフェイスを作成しようとしていますが、Freestyler受信したデータのエンコーディングを知っているため、受信したデータの解析に苦労しています。

次の画像は、受信データを表示するために接続したシリアル モニターです。Freestylerフォーマットは非常に単純で、チャネルあたり 3 バイトです。1 バイト目はstartOfMessage、2 バイト目はチャンネル番号、3 バイト目はチャンネル値で​​す。

シリアル モニタは、16 進数と 10 進数で表示されます。

テストのために、startOfmessage (定数) が正しく解析されたときに LED をオンにしようとしています。

byte myByte; 
void setup(void){
Serial.begin(9600); // begin serial communication
pinMode(13,OUTPUT);
}

void loop(void) {
if (Serial.available()>0) { // there are bytes in the serial buffer to     read
  while(Serial.available()>0) { // every time a byte is read it is   expunged 
  // from the serial buffer so keep reading the buffer until all the bytes 
  // have been read.
     myByte = Serial.read(); // read in the next byte

  }
  if(myByte == 72){
    digitalWrite(13,HIGH);
  }
  if(myByte == 48){
    digitalWrite(13,HIGH);
  }
  delay(100); // a short delay
  }

 }

誰かが私を正しい方向に向けることができますか?

シリアルモニターのスナップショット

4

1 に答える 1

1

startOfMesageチャネルと値を検出し、それを使用して読み取る必要があります。したがって、「0x48」を検出するまでシリアルからバイトを読み取ります

byte myByte, channel, value;
bool lstart = false; //Flag for start of message
bool lchannel = false; //Flag for channel detected
void setup(){
    Serial.begin(9600); // begin serial communication
    pinMode(13,OUTPUT);
}

void loop() {
   if (Serial.available()>0) { // there are bytes in the serial buffer to read
      myByte = Serial.read(); // read in the next byte
      if(myByte == 0x48 && !lstart && !lchannel){ //startOfMessage
         lstart = true;
         digitalWrite(13,HIGH);
      } else {
         if(lstart && !lchannel){ //waiting channel
             lstart = false;
             lchannel = true;
             channel = myByte;
         } else {
            if(!lstart && lchannel){ //waiting value
               lchannel = false;
               value = myByte;
            } else {
               //incorrectByte waiting for startOfMesagge or another problem
            }
         }
      }
   }
}

あまりエレガントではありませんが、機能します。

于 2015-11-12T11:55:56.437 に答える