Отправка цвета в Arduino через сериал с помощью Objective-c

Я пытаюсь отправить цвет в Arduino через серийник. Это код Objective C, работающий на моем Mac, который отправляет цвет в Arduino:

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);
}

Я не понимаю, почему первым прочитанным байтом является bever 0xff, хотя он установлен в коде Objective-C.

1

Решение

что бы я сделал, это:

  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]);

}

Надеюсь, поможет!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]