2012-04-29 17 views
0

私はArduino UNO R3を使用しています。シリアル経由でGSMシールドにATコマンドを送信すると、Serial.available()から番号が増えます。ここでArduino Serial.available()は増え続けます

は、私は、デバッグに使用している例です。私は、シリアルモニターから取得

void loop() 
{ 

    Serial.println("AT+CADC?"); 
    delay(3000); 
} 
void serialEvent() 
{ 
    char * sensorValue; 
    int serial = Serial.available(); 
    Serial.print("-"); 
    Serial.print(serial); 
    Serial.println("-"); 
    if(serial >0) 
    { 
    sensorValue = (char*) malloc(sizeof(char) * (serial +1)); 
    int i; 
    for(i = 0; i < serial; i++) 
    { 
     sensorValue[i] = Serial.read(); 
     //Serial.print(sensorValue[i]); 
    } 
    sensorValue[serial+1] = '\0'; 
    Serial.print(sensorValue); 
    } 
    delay(2000); 
} 

結果は次のとおりです。

-30-

-63

-63-

-63-

...

なぜ利用可能なバイト数は63で出て30時からスタートし、その後、最大のでしょうか?これは、バッファ内のデータを消費するSerial.read()を使用している場合でも発生します。

EDIT:serialEvent()の完全なコンステインを追加しました。

+2

コードスニペットに読み取りが表示されないため、結果が期待されます。モデム応答からのバイト数を数えます。 –

+0

最終的に言及したように、結果は読み込みでも同じです。私はコードを編集して、私が読んだところで完全なコードを表示しました。 – BOMEz

答えて

1
sensorValue[serial+1] = '\0'; 
Serial.print(sensorValue);  // <== here 

あなたが受け取ったものをモデムに送り返します。それは即座にそれを返す。ですから、ATコマンドを使うと、同じバイトを前後に送信するループが永遠に繰り返されます。 Serial.print()呼び出しを削除します。

+0

ああ、私はモデムからの応答を取得し、端末でそれを見るために探していますが、意味を参照してください。どのようにループに蹴らずに結果を得ることができますか? – BOMEz

+1

特定のArduinoハードウェアとファームウェアについては十分にわかりませんが、それは動く標的です。しかし、あなたのコードでは、2つのシリアルポートを区別する必要があります。 1つはモデム用、もう1つは端末用です。あなたが「シリアル」しか持っていないときにどうしたらいいのか分かりません。ベンダーのフォーラムは、カスタムハードウェアを扱う人を見つけるのに適しています。 –

1

ソフトウェアシリアルライブラリ[http://arduino.cc/en/Reference/SoftwareSerial]SoftwareSerial 1]を使用して、GSMモデムにUARTが必要な場合を除いて、これを使用してGSMモデムにアクセスすることをお勧めします/ RS-232レベル信号。

あなたの仕事のほとんどがモデムと話す場合には、Arduino Mega 2560が適しています。これにはRS-232出力信号はありませんが、4つのハードウェアシリアルインターフェイスがあります。そのためには、FTDIブレークアウトボードの1つを使用できる必要があります。

+0

メガ2560の良い提案、私はそれを調べなければならないかもしれません。私はプロトタイプに出ていて、最新モデルだったのでUNO R3しか手に入れませんでした。 – BOMEz

関連する問題