Arduino项目需要打印报表才能工作 我有这个ARDUNO代码,我想运行我的监听输入通过串行从一些C++代码我写。此信息正在写入连接,但我在Arduino端看到一些非常奇怪的行为

Arduino项目需要打印报表才能工作 我有这个ARDUNO代码,我想运行我的监听输入通过串行从一些C++代码我写。此信息正在写入连接,但我在Arduino端看到一些非常奇怪的行为,c++,serial-port,arduino,led,C++,Serial Port,Arduino,Led,如果我没有将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); pinMo

如果我没有将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]);
}
#定义LED#U引脚13
#定义R_引脚3
#定义G_引脚5
#定义B_引脚6
#定义帧开始((字符)255)
字符颜色[]={
0,0,0};
无效设置(){
Serial.begin(9600);
引脚模式(LED_引脚,输出);
引脚模式(R_引脚,输出);
引脚模式(G_引脚,输出);
引脚模式(B_引脚,输出);
//建立联系();
序列号。打印号(“废话”);
}
void循环(){
如果(Serial.available()>0){
char inByte=Serial.read();
切换();
//有一个新的框架吗
//Serial.println('S');
如果(inByte==frameBegin){
//Serial.println('B');
//写低音
布尔值allThree=true;
对于(int i=0;i<3;i++){
char rgb=Serial.read();
如果(rgb==frameBegin){
//Serial.println('F');
全部三个=假;
打破
}
否则{
颜色[i]=rgb;
}
}
如果(全部三个){
//printRGB();
模拟写入(R_引脚,颜色[0]);
模拟写入(G_引脚,颜色[1]);
模拟写入(B_引脚,颜色[2]);
}
}
}
}
void printRGB(){
序列号。打印(“rgb:”);
串行打印((uint8_t)颜色[0]);
连续打印(“”);
连续打印((uint8_t)颜色[1]);
连续打印(“”);
Serial.println((uint8_t)颜色[2]);
}

这有点奇怪,因为计时和转换。 首先:等待读取一个字节,输入“inByte”。 我们知道Serial.read()不能返回-1,因为我们确定至少有一个字节。 非常重要:注意int中的-1,转换为byte(uint8_t)是255(您的(char)255也表示-1,请参阅2的补码以了解原因)

然后,您可以编写一些代码,使用的速度非常快,但是您可以取消对Serial.print()的注释,它会使速度减慢

然后读取3个字节,但不确定是否已接收到3个字节;使用serial.print()时,您添加了一个延迟,很明显,让您读取这个字节,但是没有打印()您的代码太快(9600波特率意味着960字节/秒!!这真的很慢),以至于没有字节到达,您总是从serial.read中得到-1(witch意味着“无需读取”),您将其转换为char(仍然是-1),然后将其打印为(uint8_t),所以它使用了,值为255


在我的arduino uno,IDE 1.5.4上进行了测试

如果不在序列中打印任何内容,您希望阅读什么?您自己的命令不会出现,因为它们不是由arduino编写的,串行监视器也不关心您编写的日志。请参阅printRGB()。它是在我得到一个表示“帧”开始的特定字节并得到我期望的值的数量后调用的。如果你删除它,你将看不到任何东西,因为它从未被调用过。我不明白那有什么不对。为什么您希望在SerialConsole上读取某些内容并删除在SerialConsole上写入该值的代码?呜呜,对不起!在从repo中提取代码之前粘贴代码:D.立即更新-查看serial.println(“b”)serial.println(“s”)等。始终保留printRGB(),没有println(“b”/“s”),RGB值永远不会打印。