1

シリアル経由で Arduino に色を送信しようとしています。これは、Arduino に色を送信する私の Mac で実行されている Objective-C コードです。

unsigned char rgb[4];
rgb[1] = ...some color
rgb[2] = ...some color
rgb[3] = ...some color
rgb[0]=0xff; //I am setting the first value to 0xff so I know where to start reading the bytes
if(_serialFileDescriptor!=-1) {
    write(_serialFileDescriptor, rgb, 4);
}

私が送信した後、Arduinoはそれを受け取ります。最初に読み取った最初のバイトが 0xff であるかどうかを確認して、Arduino をコンピューターと同期させます。もしそうなら、私は続けて色をつけます。ここでの問題は、明らかに最初のバイトが 0xff ではなく、if ステートメントが入力されないことです。

    void loop(){
         //protocol expects data in format of 4 bytes
         //(xff) as a marker to ensure proper synchronization always
         //followed by red, green, blue bytes
         char buffer[4];
         if (Serial.available()>3) {
          Serial.readBytes(buffer, 4);
          if(buffer[0] == 0xff){ //when I comment out the if statement code works fine but    //the colors which are read are wrong
           red = buffer[1];
           green= buffer[2];
           blue = buffer[3];
          }
         }
         //finally control led brightness through pulse-width modulation
         analogWrite (redPin, red);
         analogWrite (greenPin, green);
         analogWrite (bluePin, blue);
        }

Objective-Cコードでこれに設定されているにもかかわらず、最初の読み取りバイトがbever 0xffである理由がわかりません。

4

1 に答える 1

0

私がすることは次のとおりです。

  1. コンピューターから Arduino にヘッダー バイトを送信して、有用な情報が次に来ることを認識します。
  2. コンピュータから送信される、次に来るデータ パケットの数
  3. Arduino では、シリアル読み取りのたびにデータ数をループしますbuffer[i]

コードは次のようになります (改善が必要な場合があります)。

uint8_t dataHeader = 0xff;
uint8_t numberOfData;
uint8_t rgb[3];
uint8_t redPin, greenPin, bluePin;

void setup(){

    Serial.begin(9600);

    // INITIALIZE YOUR PINS AS YOU NEED
    //
    //


}

void loop(){

    if (Serial.available() > 1) {

        uint8_t recievedByte = Serial.read();

        if (recievedByte  == dataHeader) { // read first byte and check if it is the beginning of the stream

            delay(10);
            numberOfData = Serial.read(); // get the number of data to be received.

            for (int i = 0 ; i < numberOfData ; i++) {
                delay(10);
                rgb[i] = Serial.read();
            }

        }

    }

    analogWrite (redPin, rgb[0]);
    analogWrite (greenPin, rgb[1]);
    analogWrite (bluePin, rgb[2]);

}

それが役に立てば幸い!

于 2013-10-09T07:37:46.260 に答える