0

私は Arduino UNO R3 を使用しています。AT コマンドをシリアル経由で GSM シールドに送信すると、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-

...

使用可能なバイト数が 30 から始まり、63 で最大になるのはなぜですか? これは、バッファ内のデータを消費する必要がある Serial.read() を使用した場合でも発生します。

編集: serialEvent() の完全なコンテンツを追加しました。

4

2 に答える 2

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

受信したものは何でもモデムに送り返します。それはすぐにそれをエコーバックします。そのため、AT コマンドを実行すると、同じバイトを前後に送信するループが永遠に続きます。Serial.print() 呼び出しを削除します。

于 2012-04-29T20:59:53.000 に答える
1

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

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

于 2012-04-30T04:34:50.353 に答える