我正在使用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()的完整竞争。
答案 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分线板。