3

如何在 Arduino 上捕获 AT 命令的输出?

我正在使用带有 GSM 屏蔽的 Arduino Uno R3。我有所有的 AT 命令(可以在这里看到),如果我使用终端并获得输出,我可以很好地输入它们。但是如何通过代码捕获结果输出?下面的代码显示了我尝试过的内容,但它不起作用。特别是在我尝试获取模拟输入然后打印出结果的地方。

#include <SoftwareSerial.h>

SoftwareSerial mySerial(7, 8);

void setup()
{
  char sensorValue[32] ="";
  Serial.begin(9600); 
  mySerial.begin(9600); 
  Serial.println("\r");

  //Wait for a second while the modem sends an "OK"
  delay(1000);                    

  //Because we want to send the SMS in text mode
  Serial.println("AT+CMGF=1\r");    
  delay(1000);

  mySerial.println("AT+CADC?");     //Query the analog input for data
  Serial.println(Serial.available());    
  Serial.println(Serial.read());    //Print out result???

  //Start accepting the text for the message
  //to be sent to the number specified.
  //Replace this number with the target mobile number.
  Serial.println("AT+CMGS=\"+MSISDN\"\r");    


  delay(1000);
  Serial.println("!");   //The text for the message
  delay(1000);
  Serial.write(26);  //Equivalent to sending Ctrl+Z 
}

void loop()
{
  /*
    if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());  
    */
}

我得到输出:

AT+CMGF=1

AT+CADC?21 13

或者

AT+CMGF=1

AT+CADC?18 65

不管我的模拟信号源有什么变化

4

1 回答 1

2

在此处查看SoftwareSerialread函数的文档。

当您从 GSM 设备串行接口读取数据时,您不能想当然地认为缓冲区中有要读取的字节。

很有可能mySerial.read()返回-1(没有可用的字节),因为 Arduino 在 GSM 设备可以在串行端口上提供某些东西之前运行该代码。

您应该使用该available函数(此处的文档)来测试串行接口的传入字节。您可以将其与超时一起使用以避免无限等待。

您可以尝试的最好的事情是编写一个单独class的来处理串行操作(读取、写入、超时、延迟等)。

另外,我曾经为 Arduino 编写了一个 GPRS 驱动程序。我遇到了电源问题,需要我在 GPRS 设备上安装一个额外的电容器,并使用输出电流超过 2A 的电源。

于 2012-04-26T20:47:03.623 回答