0

新しい Sim900 を入手し、Arduino Uno に接続しました。以下のコードを使用して、自分にテキストを送信しました。セルでテキストを受信しましたが、シリアル モニターでエコーを受信しませんでした (つまり、「OK」)。RX/TX ピンと異なるボー レートを交換しようとしましたが、成功しませんでした。


void setup()
{
  Serial.begin(9600);  //Baud rate of the GSM/GPRS Module 
  Serial.println("");
  delay(2000);                  
  Serial.println("AT+CMGF=1");    
  delay(1000);
  Serial.println("AT+CMGS=\"+120########\"");    //Number to which you want to send the sms
  delay(1000);
  Serial.print("This is a test.");   //The text of the message to be sent
  delay(1000);
  Serial.write(0x1A); // send CTRL - z to end message
  Serial.write(0x0D); // Carriage Return
  Serial.write(0x0A); // Line Feed
  delay(5000); 
 }

void loop()
{
}
4

2 に答える 2

0

モデムから返された応答を読み取ったり解析delayしたりする代わりに、絶対に使用しないでください。さて、これは少し皮肉なアドバイスであることは認識していますが、問題は応答が得られないことですが、応答が機能するようになった瞬間に遅延を使用してこのコードを破棄する必要があります。

この点を強調するために、AT コマンド ラインをモデムに送信した後、モデムが最終的な結果コードで応答するまでは何も送信しないでください。V.250標準には次のように記載されています。

最終結果コードは、完全な DCE アクションの完了と、DTE からの新しいコマンドを受け入れる意思があることを示します。

最終結果コードを受信する前に何かを送信すると、現在実行中のコマンドが中止されます。


私はこの sim900 モデムを知りませんが、モデムは通常、文字をエコーせず結果コード (ATEおよびATQコマンド) を抑制するように構成できることに注意してください。そのため、モデムが文字をエコーし​​て結果コードを出力するように構成されていることを完全に確実に知っていない限り、最初に確認する必要があります。

これはすべて、非常に重要なドキュメントである V.250 標準で説明されています。第 5 章をすべて読み、第 6.2 章の DTE-DCE インターフェイス コマンドにも十分注意してください。


携帯電話関連のコマンドは一般に27.007 規格で規定されていますが、SMS メッセージ関連のコマンドは27.005 規格で規定されています。AT+CMGS特に、SMS ペイロードを送信する前に「\n\r>」の受信を待つ必要があるという事実に細心の注意を払ってください (この回答の最初の部分も参照してください)。

于 2016-02-21T02:16:50.653 に答える
0

@hlovdal が言うように、メッセージ間に遅延を使用するのは悪い考えです。各コマンドの応答を待って、応答に応じて (またはタイムアウトのために) アクションを実行する必要があります。


それがすべてのコードであると仮定すると、シリアルポートの読み取りの部分をスキップしています。serial.write と同じように、入ってくる文字を取得するには serial.read を使用する必要があります。何も受信していないため、これが原因である可能性があります。


最後に、Arduino UNO には 1 つの UART ポートがあるため、デバッグ用のシリアル モニターが必要な場合は、SoftwareSerial を使用して SIM900 と通信する必要があります。

于 2016-02-22T04:43:27.197 に答える