我正在做一个非常重要的项目,需要最大的效率和最快的速度。基本上,我使用Arduino的串行端口与SIM900 GSM进行通信,但是我认为这可以应用于连接到Arduino串行端口的任何其他设备。问题在于,在我发送给SIM900的每个命令之后,我都会延迟一些时间,因为我不知道执行该命令需要花费多少时间,但是有时命令执行的速度可能非常快或非常慢。我的问题是:如何在不使用延迟的情况下显示SIM900的输出,但可能会执行do {} while;检查是否需要显示新内容的循环?如果你们能帮助我,我将不胜感激。谢谢!
以下是我用于串行通信的一些命令:
myGsm.begin(19200);
Serial.begin(9600);
delay(500);
myGsm.println("AT+CGATT=1");
delay(200);
printSerialData();
myGsm.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");//setting the SAPBR,connection type is GPRS
delay(1000);
printSerialData();
myGsm.println("AT+SAPBR=3,1,\"APN\",\"internet.wind\"");//setting the APN,2nd parameter empty works for all networks
delay(5000);
printSerialData();
myGsm.println("AT+SAPBR=0,1");
delay(1000);
printSerialData();
myGsm.println("AT+SAPBR=1,1");
delay(10000);
printSerialData();
myGsm.println("AT+HTTPINIT"); //init the HTTP request
delay(2000);
printSerialData();
void printSerialData()
{
while(myGsm.available()!=0)
Serial.write(myGsm.read());
}
答案 0 :(得分:1)
有几种方法可以解决您的问题。一种方法是在收到数据之前进行阻塞循环:
void printSerialData()
{
//Block until data is received
while(myGsm.available() <= 0);
//Get received
while(myGsm.available() > 0)
{
while(myGsm.available() > 0)
{
Serial.write(myGsm.read());
}
//Give chance to receive more
delay(10);
}
}
另一种方法利用了一个事实,即AT命令通常由\r\n
完成。这意味着您可以尝试接收数据,直到最后一个\n
。像这样使用readBytesUntil或readStringUntil:
void printSerialData()
{
String read = myGsm.readStringUntil('\n');
Serial.write(read);
}
请不要忘记之前致电setTimeout来设置正确的超时时间。