如何消除延迟?

时间:2019-12-29 09:30:16

标签: arduino

我正在做一个非常重要的项目,需要最大的效率和最快的速度。基本上,我使用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());
}

1 个答案:

答案 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。像这样使用readBytesUntilreadStringUntil

void printSerialData()
{
    String read = myGsm.readStringUntil('\n');
    Serial.write(read);
}

请不要忘记之前致电setTimeout来设置正确的超时时间。