2015-02-23 49 views
1

我有Arduino GSM屏蔽,我有一个名为SimpleGSM的类来发送短信。 SimpleGSM类继承了SoftwareSerial。如何解析Arduino中AT命令的响应?

我有以下方法:

bool 
SimpleGSM::sendSMS (const String phoneNumber, const String message) 
{ 
    const byte CONTROL_Z_HEX_CODE = 0x1A; 

    const unsigned long SERIAL_DELAY_TIME = 500; 

    this->flush(); 

    this->print(F("AT+CMGS=\"")); 

    this->print(phoneNumber); 

    this->print(F("\"\r")); 

    delay(SERIAL_DELAY_TIME); 

    this->flushInput(); 

    this->print(message); 

    this->write(CONTROL_Z_HEX_CODE); 

    delay(SERIAL_DELAY_TIME); 

    this->flushInput(); 
} 

上述方法成功地发送短信,但我不检查AT命令的响应。

我有用于禁用ECHO和调制解调器设置为SMS文本模式一些其他方法:

bool 
SimpleGSM::setEcho (const bool state) 
{ 
    this->flush(); 

    this->print(F("ATE")); 

    this->print(state); 

    this->print(F("\r")); 

    return this->find(OK_RESPONSE_FORMAT); 
} 

bool 
SimpleGSM::setSMSMode (const byte mode) 
{ 
    this->flush(); 

    this->print(F("AT+CMGF=")); 

    this->print(mode); 

    this->print(F("\r")); 

    return this->find(OK_RESPONSE_FORMAT); 
} 

以上两种方法成功地处理的AT命令的响应。

我的问题是,我想处理这样的sendSMS方法的AT命令的响应:

bool 
SimpleGSM::sendSMS (const String phoneNumber, const String message) 
{ 
    const byte CONTROL_Z_HEX_CODE = 0x1A; 

    this->flush(); 

    this->print(F("AT+CMGS=\"")); 

    this->print(phoneNumber); 

    this->print(F("\"\r")); 

    if (!this->find("\r\n> ")) 
    { 
    return false; 
    } 

    this->print(message); 

    this->write(CONTROL_Z_HEX_CODE); 

    return this->find(OK_RESPONSE_FORMAT); 
} 

但是,由于某种原因,这是行不通的。 'this-> find(“\ r \ n>”)'总是返回false。

请考虑也是OK_RESPONSE_FORMAT是:

char * SimpleGSM::OK_RESPONSE_FORMAT = "\r\nOK\r\n"; 
+0

有没有人能真正帮助我? – 2015-02-24 22:54:52

+0

您可以添加一个循环来简单地打印返回的所有内容,然后检查结果。这可能是因为调制解调器没有发送您期望的消息,或者发送的格式稍有不同。 – Mick 2015-02-26 10:18:20

回答

0

AT命令的响应通常由模块通过相同的连接发送。也就是说,如果串行连接到模块,则发送到发送引脚,并从接收引脚读取(tx与rx)。

+0

当然,但代码无法正常工作。 – 2015-02-25 12:47:18