У меня есть этот Arduino-код, который я хочу запустить, который прослушивает входные данные, поступающие через последовательный порт из некоторого кода на C ++, который я пишу. Эта информация записывается в соединение, но я вижу действительно странное поведение на стороне Arduino.
Если я не помещаю операторы print (в частности, операторы non printRGB ()), я не вижу выходных данных в последовательную консоль. Как только я добавляю их, они начинают появляться снова. В чем дело?
#define LED_PIN 13
#define R_PIN 3
#define G_PIN 5
#define B_PIN 6
#define frameBegin ((char) 255)
char colors[] = {
0,0,0};
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
pinMode(R_PIN, OUTPUT);
pinMode(G_PIN, OUTPUT);
pinMode(B_PIN, OUTPUT);
// establishContact();
Serial.println("blah");
}
void loop() {
if (Serial.available() > 0) {
char inByte = Serial.read();
toggleLED();
// Got a new frame
//Serial.println('S');
if (inByte == frameBegin) {
//Serial.println('B');
//write bass
boolean allThree = true;
for (int i=0; i < 3; i++) {
char rgb = Serial.read();
if (rgb == frameBegin) {
//Serial.println('F');
allThree = false;
break;
}
else {
colors[i] = rgb;
}
}
if (allThree) {
//printRGB();
analogWrite(R_PIN, colors[0]);
analogWrite(G_PIN, colors[1]);
analogWrite(B_PIN, colors[2]);
}
}
}
}
void printRGB() {
Serial.print("rgb: ");
Serial.print((uint8_t) colors[0]);
Serial.print(" ");
Serial.print((uint8_t) colors[1]);
Serial.print(" ");
Serial.println((uint8_t) colors[2]);
}
Это немного странно, потому что время и конверсия.
Прежде всего: вы ждете, пока ОДИН байт прочитан, вставьте «inByte».
Мы знаем, что Serial.read () не может вернуть -1, потому что мы уверены, что есть хотя бы один байт.
ОЧЕНЬ ВАЖНО: обратите внимание, что -1 в int, покрытый байтом (uint8_t), равен 255 (также ваш (char) 255 означает -1, см. Дополнение 2, чтобы понять, почему)
затем вы делаете некоторый код, с очень быстро, но вы можете раскомментировать Serial.print () ведьма замедлит его.
затем вы читаете 3 байта, не будучи уверенными, что 3 байта были получены; с serial.print () вы добавили задержку с, lucily, пусть вы читаете этот байт, НО без печати () ваш код настолько быстр (скорость 9600 бод означает 960 байт / с !! это очень медленно), что байт не поступает и вы всегда получаете -1 из Serial.read (ведьма означает «нечего читать»), и вы конвертируете его в символ (все еще -1), но затем печатаете его как (uint8_t), и поэтому он назначен и имеет значение 255 ,
протестировано на моем arduino uno, IDE 1.5.4
Других решений пока нет …