0

我正在使用 Arduino UNO R3,当我通过 Serial 向我的 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() 的完整内容。

4

2 回答 2

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

您将收到的任何内容发送回调制解调器。这立即回应了它。因此,一旦您使用 AT 命令进行操作,您将永远循环来回发送相同的字节。删除 Serial.print() 调用。

于 2012-04-29T20:59:53.000 回答
1

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

如果您的大部分工作都涉及与调制解调器通信,另一种选择可能是合适的,它是 Arduino Mega 2560。它有四个硬件串行接口,尽管它没有 RS-232 输出信号。为此,您应该能够使用其中一个 FTDI 分线板。

于 2012-04-30T04:34:50.353 回答