C++ Arduino序列号。出现奇怪错误

C++ Arduino序列号。出现奇怪错误,c++,serial-port,arduino,C++,Serial Port,Arduino,我正在尝试从Arduino串行端口读取数据。我当前的代码: if(Serial.available()>0){ if(Serial.available()==9){...} 当我在串行监视器中键入9个字符时,它工作正常。 因此,当我在 如果(Serial.available()>0) 之后 如果(Serial.available()==9){} 它将每个字符识别为单个读数。例如,当我键入4个字符时,它会显示Serial.available()=14次 实数代码: if(Seria

我正在尝试从Arduino串行端口读取数据。我当前的代码:

if(Serial.available()>0){
if(Serial.available()==9){...}
当我在串行监视器中键入9个字符时,它工作正常。 因此,当我在

如果(Serial.available()>0)

之后

如果(Serial.available()==9){}

它将每个字符识别为单个读数。例如,当我键入4个字符时,它会显示
Serial.available()=1
4次

实数代码:

    if(Serial.available() > 0){
        if(Serial.available()==9){
        for(int i =0;i<9;i++){
           RGB[i]=Serial.read() - '0';
        }

        //get the data from the integer array
        R= RGB[0]*100+RGB[1]*10+RGB[2];
        G= RGB[3]*100+RGB[4]*10+RGB[5];
        B= RGB[6]*100+RGB[7]*10+RGB[8];
        for(int q=0; q<=255; q++){
           if(R>Rp){
              Rp+=1;
              analogWrite(8, Rp);
           }else if(R<Rp){
              Rp-=1;
              analogWrite(8, Rp);
           }
           if(G>Gp){
              Gp+=1;
              analogWrite(9, Gp);
           }else if(G<Gp){
              Gp-=1;
              analogWrite(9, Gp);
           }
           if(B>Bp){
              Bp+=1;
              analogWrite(10, Bp);
           }else if(B<Bp){
              Bp-=1;
              analogWrite(10, Bp);
           }
           delay(10);

       }
  }
  //  if(Serial.read()=='r'){
  //        if(readinglstate==0){
  //          analogWrite(readinglight, 5);
  //          readinglstate=1;
  //        }else if(readinglstate==1){
  //          analogWrite(readinglight, 70);
  //          readinglstate=2;
  //        }else if(readinglstate==2){
  //          analogWrite(readinglight, 255);
  //          readinglstate=3;
  //        }else if(readinglstate==3){
  //          analogWrite(readinglight, 0);
  //          readinglstate=0;
  //        }
  //      }
  }
if(Serial.available()>0){
if(Serial.available()==9){

对于(int i=0;i输入数据可以分为几个块到达,因此您需要稍微修改读取数据的方法,请检查以下代码以供参考:

int bytesToRead = 0;
int currBytePtr = 0;

int RGB[9];
while (9 > currBytePtr) { // we need 9 bytes of data
    if (0 < (bytesToRead = Serial.available())) { // have something to read
        for (int i = 0; i < bytesToRead; ++i ) {
            RGB[currBytePtr++] = Serial.read();
            if (9 == currBytePtr) { // we have enough data
                break;
            }
        }
    } else {
        delay(1000); // sleep a bit
    }
} // while

// process data received
...
int-bytesToRead=0;
int currBytePtr=0;
int-RGB[9];
而(9>currBytePtr){//我们需要9字节的数据
如果(0<(bytesToRead=Serial.available()){//有东西要读
for(int i=0;i

正在从接收缓冲区弹出字节。请将其想象为

input = Serial.read(); // pop the next byte off, regardless of its value.
if (input == 'r') {
因此,缓冲区中的所有字节都从缓冲区中读取。直到“Serial.available()==0” 我建议使用peek函数

if(Serial.peek()=='r'){
  Serial.read(); // already know it, so pop it.
  if(readinglstate==0){
...

为什么不直接读取数据直到有9个字节,然后再进行处理呢

char buffer[10];
int index=0;
while (Serial.available()){
    buffer[index++]=Serial.read();
    if (index>8) {
        ProcessData(buffer);
        index=0;
    }
}

请尽可能多地显示真实的代码。这样一来,你问的问题就不太清楚了。还有什么问题?I/O中通常不能保证所有你认为是逻辑单元的数据都是以单个块的形式出现的。实际上你的问题是很低的质量。你在问什么?你的问题是什么,你想做什么?实现?我在问我能做些什么来解决这个问题..还有什么?@user3154924'它说的是
Serial.available()=1
4次'it'到底是什么,它是怎么说的?你的调试器?
char buffer[10];
int index=0;
while (Serial.available()){
    buffer[index++]=Serial.read();
    if (index>8) {
        ProcessData(buffer);
        index=0;
    }
}