Arduino Serial.available()不断增加

时间:2012-04-29 20:34:39

标签: c++ arduino

我正在使用Arduino UNO R3,当我通过串口向我的GSM屏蔽发送AT命令时,我从Serial.available()获得越来越多的数字。

以下是我用于调试的示例:

void loop()
{

    Serial.println("AT+CADC?");
    delay(3000);
}
void serialEvent()
{
  char * sensorValue;
  int serial = Serial.available();
  Serial.print("-");
  Serial.print(serial);
  Serial.println("-");
  if(serial >0)
  {
    sensorValue = (char*) malloc(sizeof(char) * (serial +1));
    int i;
    for(i = 0; i < serial; i++)
    {
      sensorValue[i] = Serial.read();
      //Serial.print(sensorValue[i]);
    }
    sensorValue[serial+1] = '\0';
    Serial.print(sensorValue);
  }
  delay(2000);
}

我从串口监视器得到的结果是:

  

-30 -

     

-63 -

     

-63 -

     

-63-

     

...

为什么可用的字节数从30开始,然后在63开始最大?即使我使用Serial.read(),它也应该使用缓冲区中的数据。

编辑:添加了serialEvent()的完整竞争。

2 个答案:

答案 0 :(得分:1)

sensorValue[serial+1] = '\0';
Serial.print(sensorValue);      // <== here

您将收到的任何内容发送回调制解调器。哪个及时回复了它。所以一旦你使用AT命令,你将永远循环发送相同的字节来回。删除Serial.print()调用。

答案 1 :(得分:1)

我建议您使用软件序列库 - [http://arduino.cc/en/Reference/SoftwareSerial]SoftwareSerial 1 - 并使用它来访问GSM调制解调器,除非GSM调制解调器需要UART / RS-232电平信号。

另一种替代方案,如果您的大多数工作涉及与调制解调器通信,可能是合适的,它将是Arduino Mega 2560.它有四个硬件串行接口,但它没有RS-232输出信号。为此,您应该能够使用其中一个FTDI分线板。