我有这个我想要运行的Arduino代码,它通过串口从我正在编写的一些c ++代码中侦听输入。这些信息正被写入连接,但我看到Arduino方面有一些非常奇怪的行为。
如果我没有放入print语句(特别是非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]);
}
答案 0 :(得分:0)
这有点奇怪,因为时间和转换。 首先:你等待一个字节加入,放入“inByte”。 我们知道Serial.read()不能返回-1,因为我们确定至少有一个字节。 非常重要:请注意,int中的-1,转换为byte(uint8_t)为255(同样,您的(char)255表示-1,请参阅2的补码以了解原因)
然后你做了一些代码,非常快,但是你可以取消注释Serial.print()会降低它的速度。
然后你读3字节而不确定是否已经收到了3个字节;使用serial.print()你添加了一个延迟,可以让你读取这个字节,但是没有print()你的代码是如此之快(9600波特率意味着960byte / s !!这真的很慢)没有字节到达并且你总是从Serial.read得到一个-1(女巫的意思是“无需阅读”)并将它转换为char(仍为-1),但是然后将其打印为(uint8_t),因此它被赋值并且值为255
在我的arduino uno,IDE 1.5.4上测试