如何显示/保存返回AT命令的值

时间:2014-09-09 23:06:17

标签: c++ arduino at-command

美好的一天! 我正在与Arduino UNO和SIM908合作开展一个项目。 我想了解AT命令。 当我进入

Serial.print("AT")
Serial.println("AT+CGPSSTATUS?");

串行返回一个值,我想将该值保存到缓冲区

char buffer[size]

我不希望有其他字符串而不是AT命令的返回值。

我也是那个文件的红色 SIM908 AT Command Manual_V1.01

在第13页,您可以阅读(NB。< CR>< LF>:我在第一个<之后添加了一个空格,其他没有显示空格

  

&#34; AT&#34;或&#34; at&#34;必须在每个Command的开头设置前缀   线。要终止命令行,请输入&lt; CR取代。命令通常是   然后是包括的回复。 &#34;&LT; CR&GT;&LT; LF&GT;&LT; CR&GT;&LT; LF&GT;&#34;   在整个文档中,仅提供了响应,&lt; CR&GT;&LT; LF&GT;   故意省略

然后,我问我怎样才能提取&#34; < CR>< LF>< CR>< LF>

之间的回复

看一下这个例子(让我知道我错了),如何检测< CR>< LF>

void setup()
    {
char buffer[200];
    Serial.println("AT+CGPSSTATUS?");
    }
    void loop()
    {    
          if (Serial.available())
           {
// HERE I SHOULD CHECK IF CR ANF LF
             Serial.write(Serial.read());
// AND SAVE IT IN buffer. IS'T NOT?
           }
        }  

    }

你明白我的意思吗? 你怎么能帮我存储一个缓冲区,只有AT命令的返回值?

非常感谢您的帮助

2 个答案:

答案 0 :(得分:0)

这里有一段代码来检测和删除CR + LF(注意:如果读取了CR,但它后面没有LF,它也会被删除):

   if (Serial.peek()==13) {      // check if CR (without reading)
       Serial.read();            // read and ignore 
       if (Serial.peek()==10)    // then check if LF (without reading)
          Serial.read(); 
       } 

要阅读来自Serial的其余回复,您可以使用:

buffer[Serial.readBytesUntil(13, buffer, 199)]=0; // readbytes returns the number of bytes read  

然后你必须丢弃结束的CRLF(与上面相同)。

修改

您在单独的答案中发布了代码的几个问题。

当您powerUpSim908()时,您必须知道gsm模块可能会发送未请求的数据(参见文档,第1.4章):

  

注意:HEX字符串,例如&#34; 00 49 49 49 49 FF FF FF FF&#34;将被发送   紧接着以115200的波特率通过串口输出   SIM908已开机。字符串应该被忽略,因为它被用于   与PC工具同步。只能通过串口输入AT命令   SIM908上电后的端口和未经请求的结果代码&#34; RDY&#34;是   从串口收到。

这意味着在发送任何内容之前,您必须通过阅读它来丢弃此数据。我想这就是为什么你在阅读回复时没有得到CRLF的原因:你首先得到HEX字符串或&#34; RDY&#34;。

然后readBytesUntil()读取尽可能多的字节数(上例中的maxi 199),将它们存储在缓冲区中。它在遇到字节13(即CR)时停止读取。无需循环索引。该函数返回可以读取的字符数,并且它不会在缓冲区的末尾放置结尾0(即没有有效的C字符串)。如果你想以不同于我提议的方式使用该函数,你必须存储返回的长度,因为你没有其他方法可以在以后找到它。

答案 1 :(得分:0)

你告诉我的是非常有趣的。以下是我调整代码的方法

我调整了我的代码,并且在我发送AT命令的同时创建了一个用于测试Serail的文件。 关注函数是loop()和read_AT_string()。 (我将read_String重命名为read_AT_string()。

这里我的代码和我在问题发生后解释了你的提议

#include <SoftwareSerial.h>

int baud_rate = 9600;
int pin_gsm = 3;
int pin_gps = 4;
int pin_power = 5;
//int pin_dtr = 6;
boolean debug = true;
boolean raedy_to_go = false;

// Reading String
#define BUFFERSIZE 200
char buffer[BUFFERSIZE];
char inChar;
int index;

void setup()
{
  Serial.begin(baud_rate);
  delay(5000);                         // Wait for 5sec after begin

  if(debug)
  {
    Serial.println(F("\n****************************"));
    Serial.println(F("STARTING SYSTEM Read AT stream"));
    Serial.println(F("******************************"));
  }
  pinMode(pin_gsm,OUTPUT);            // Set the pins
  pinMode(pin_gps,OUTPUT);
  pinMode(pin_power,OUTPUT);

  powerUpSim908:
  if(powerUpSim908())
  {
    delay(1000);

    if(gps_power()){

      gsm_enable();
      raedy_to_go = true;

      if(debug)
      {
        Serial.println(F("\n****************************"));
        Serial.println(F("READY TO GO\n"));
        Serial.println(F("****************************\n"));
      }  
    }
    else
    {
      raedy_to_go = false;
      if(debug)
      {
       Serial.println(F("\nNOT READY TO GO.\nGPS could not be power\nRestart the module\nor/and check the battery level.\n"));
      }
      goto powerUpSim908;
    }
  }
  else
  {
    raedy_to_go = false;
    if(debug)
    {
      Serial.println(F("\nNOT READY TO GO.\nCheck the battery level.\n"));
    } 
  };
}

void loop()
{
  /*
   if (Serial.available())
   {
     Serial.print("Character received: ");
     Serial.write(Serial.read());
     Serial.println("");
   }
   */
    if(raedy_to_go)
    {

       read_AT_string("AT",5000);
       delay(10000);

    }  

}

char read_AT_string(char* command, int timeout)
{
  unsigned long previous;
  previous = millis();


  Serial.println(F("\nDISPLAY BUFFER:"));
  index=0;

  Serial.println(command);
  do
  {
    if(Serial.available() > 0) // Don't read unless
    // there you know there is data
    {
      Serial.println("1");
      if (Serial.peek() == 13)           // check if CR (without reading)
      {      
        Serial.println("13");
        if(Serial.available() > 0)
        {
        Serial.read();                // read and ignore 
        if (Serial.peek()==10)        // then check if LF (without reading)
         {
           Serial.println("10");
           if(index < Serial.readBytesUntil(13, buffer, BUFFERSIZE-1))   // One less than the size of the buffer array
            {
              Serial.println("b");
              inChar = Serial.read();  // Read a character
              buffer[index] = inChar;  // Store it
              index++;                 // Increment where to write next
              buffer[index] = '\0';    // Null terminate the string
            }
          }
         }
      }
    }
  }while(((millis() - previous) < timeout));

  Serial.println(buffer);
  buffer[0]='\0';
  Serial.println(F("END DISPLAY BUFFER"));
}

/* FUNCTION */

boolean powerUpSim908(void)
{
  if(debug)
  {
    Serial.println(F("Powering up SIM908"));  
  }
  boolean turnedON = false;
  //uint8_t answer=0;
  int cont;

  for (cont=0; cont<3; cont++)
  {
    digitalWrite(pin_power,HIGH);
    delay(1500);
    digitalWrite(pin_power,LOW);

    Serial.println(F("Checking if the module is up"));
    if(sendATcommand("AT", "OK", 5000))
    {
    cont = 4; // Leave the loop
    turnedON = true;
    }
    else
    {
      turnedON = false;
      if(debug)
      {
    Serial.println(F("\nTrying agin to turn on SIM908"));  
      }
    };
  }

  if(turnedON)
  {
    if(debug)
    {
      Serial.println(F("Module is tunrned up\n"));
    }
  }
  else
  {
      if(debug)
      {
    Serial.println(F("Module is NOT tunrned ON\n"));  
      }
   }    
    return turnedON;
}

boolean sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout)
{
    uint8_t x=0;
    bool answer=false;
    //åchar response[100];
    //buffer[0]='\0';
    unsigned long previous;

    //memset(response, '\0', 100);    // Initialice the string
    //Serial.println(response);

    delay(100);

    while( Serial.available() > 0) Serial.read();    // Clean the input buffer

    if (ATcommand[0] != '\0')
    { 
        Serial.println(ATcommand);    // Send the AT command   
    }

    x = 0;
    previous = millis();

    index=0;
    do
    {
      if(Serial.available() > 0) 
      // there you know there is data
      {
        if(index < BUFFERSIZE-1) // One less than the size of the array // Same as buffer size
        {
          inChar = Serial.read(); // Read a character
          buffer[index] = inChar; // Store it
          index++; // Increment where to write next
          //Serial.println(index);
          buffer[index] = '\0'; // Null terminate the string
        }
      }
    }while(((millis() - previous) < timeout));


    if(strstr(buffer,"NORMAL POWER DOWN") != NULL)
    {
       answer = false;
    }
    else if (strstr(buffer, expected_answer) != NULL)    // check if the desired answer (OK) is in the response of the module
    {

      /*
      Serial.println(F("### BUFFER")); 
      Serial.println(buffer);
      Serial.println(F("### END BUFFER"));
      */
       answer = true;
    }
    else
    {
      answer = false;
    }   

    if(debug)
        {
          if(answer)
          {
            //Serial.println(F("Expected answer : OK!\n"));
          }
          else
          {
            //Serial.println(F("Expected answer : KO!\n"));
          };
  }     
  return answer;
}


void gps_enable(void)
{
  if(debug)
  {
    Serial.println(F("\nEnabling GPS ..."));
  }
  digitalWrite(pin_gps,LOW);                //Enable GPS mode
  digitalWrite(pin_gsm,HIGH);                //Disable GSM mode
  delay(2000);
}



void gsm_enable(void)
{
  if(debug)
  {
    Serial.println(F("\nEnabling GSM ..."));
  }
  digitalWrite(pin_gsm,LOW);                //Enable GSM mode
  digitalWrite(pin_gps,HIGH);               //Disable GPS mode
  delay(2000);
}


/* UTILISTIES */


/* GPS */

boolean gps_power(void)                            //turn on GPS power supply
{
  /*
  Serial.println("AT");  
  delay(2000);
  */

  boolean gpspwr = false;
  boolean gpsrst = false;


  if(sendATcommand("AT+CGPSPWR=1","OK",2000))
  {
    gpspwr = true;
     if(debug)
    {
      Serial.println("turn on GPS power supply => OK");
    }
  }
  else
  {
    if(debug)
    {
      Serial.println("turn on GPS power supply => KO");
    }
  }; 
  //delay(1000);

  if(sendATcommand("AT+CGPSRST=1","OK",2000))
  {
    gpsrst = true;
    if(debug)
    {
      Serial.println("reset GPS in autonomy mode => OK");
    }
  }
  else
  {
    if(debug)
    {
      Serial.println("reset GPS in autonomy mode => KO");
    }
  };   //reset GPS in autonomy mode

  delay(1000);

  if(gpspwr && gpsrst)
  {
    return true;
  }else
  {
    return false;
  }
}

在read_AT_string处,第一个if(Serial.peek()== 13)总是返回false。

打印

1,但是&#39; 13&#39;不是,那我想是

if(Serial.peek()==13)

返回false

这是5秒内打印的内容

AT DISPLAY BUFFER:
1 
1 
1 
1 
1 
1 
1 
1 
1 
[...] // It prints 1 until now 
1

END DISPLAY BUFFER