Я пытаюсь отправить цвет в 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.
что бы я сделал, это:
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]);
}
Надеюсь, поможет!
Других решений пока нет …