2

私の質問を見てくれてありがとう。

毎秒「Hello World」を印刷するなど、少量のデータのみを送信している場合、RN42 Bluetooth モジュールでこの問題が発生します。このコードを使用する場合:

void setup()
{

    //Open serial communications and wait for port to open:
    //Serial.begin(115200);
    Serial1.begin(9600);


}

void loop()
{ 
  Serial1.print("Hello World");
  //delay(1000);
}

モジュールに接続するときに RN42 でこのコードを使用すると、約 3 秒間接続されたままになり、再起動します。9600 と 115200 の両方を試しましたが、どちらも数秒後に接続を閉じます。

これは大規模なプロジェクトの一部であり、正常に実行されていますが、状況によってはクラッシュしていたため、これを指摘することができました。

RX と TX を Arduino に直接接続し、CTS と RTS を相互に接続しています。

誰かに同様の問題がありましたか?

よろしく

ジェイミー

私は問題が何であるかを理解することができたので、共有したいと思いました. モジュールがコマンド モードで「$$$」を入力できる場合、Bluetooth モジュールに大量のデータを送信しようとすると、Bluetooth モジュールがリセットされます。それは小冊子の小さなメモにあります:

注: モジュールは高速データ モードをサポートします。このモードでは、モジュールは $$$ を受信して​​もコマンド モードにはなりません。構成ウィンドウ (60 秒) 内にコマンド モードに入らない場合、モジュールは高速データ モードに入ります。

私は常にコマンドモードを使用していたので、Fast Data Mode に入ることはありませんでした。コマンドタイムアウトを 5 秒に設定したので、それを使用する必要がある場合は、モジュールをリセットするだけです。

4

1 に答える 1

0

次の自家製ライブラリを使用して、Serial3 の RN42 と通信します。::begin() 中に安定するように 50 ミリ秒の遅延があることに注意してください。この後は、単に Serial3.Print または Read を使用します。必要に応じてシリアル番号とピンを変更します。

#define DEFAULT_FLUSH_TIMEOUT 50 // ms
#define BT_RX                 14 // PJ1 Output, USART3_TX
#define BT_TX                 15 // PJ0 Input,  USART3_RX
#define BT_CTS                27 // PA5 Output, Active Low,  Enable Device Transmission
#define BT_RTS                26 // PA4 Input , Active Low,  Requesting Data
#define BT_RST                23 // PA1 Output, Active Low,  Resets BlueTooth Transciever

void RN42::begin() {
  digitalWrite(BT_RST, BT_RST_Enabled);   //Take Radio out of Reset
  digitalWrite(BT_CTS, BT_CTS_Enabled);   //Enable Transmitter

  delay(750); // need to wait for the radio to stablize.

  Serial.print("$$$ = ");
  Serial.print (command("$$$", '\n', DEFAULT_FLUSH_TIMEOUT));
  Serial.println();
  delay(100); // delay as it avoids problems, with flush.

  read_version = command("v\n", '\n', DEFAULT_FLUSH_TIMEOUT);
  read_serial = command("GB\n", '\n', DEFAULT_FLUSH_TIMEOUT);
  read_connection = command("GK\n", '\n', DEFAULT_FLUSH_TIMEOUT);

  Serial.print("Online = ");
  Serial.print(command("---\n", '\n', DEFAULT_FLUSH_TIMEOUT));
  Serial.println();

  Serial.print("version1 = ");
  Serial.println(read_version);

  Serial.print("Serial = ");
  Serial.print(read_serial);
  Serial.println();

  Serial.print("Connection = ");
  Serial.print(read_connection);
  Serial.println();
}

void RN42::end() {
  //turn radio of and put into reset.
  digitalWrite(BT_RST, BT_RST_Disabled); 
  digitalWrite(BT_CTS, BT_CTS_Disabled);
}   

void RN42::TxOff() {
  // turn Transmitter off to save power
  digitalWrite(BT_CTS, BT_CTS_Disabled);
}   

void RN42::TxOn() {
  // turn Transmitter on, more power
  digitalWrite(BT_CTS, BT_CTS_Enabled);
}

void RN42::flush(long timeout) {
    long start_time = millis();
    int state = 1;
    char c;
    while (state)
    {
      int i = Serial3.available();
      for (int  thischar = 0; thischar < i; thischar++) {
        c = Serial3.read();
      }
      if ( (millis() - start_time) > timeout ) 
      {
        state = 0;
      }
    }
}

String RN42::command (String sCommand, char cTerminator, long timeout)
{
  String    inData="";
  long start_time = millis();
  int state = 0;
  Serial3.print(sCommand);
  while (!state)
  {
    int len = Serial3.available();      
    for (int  thischar = 0; thischar < len; thischar++) {
        char c = (char) Serial3.read();
//              Serial.print("0x");
//              Serial.println((int) c, HEX);
        if ((c == '\n')) {// || (c == '\r')) {
          state = 1;
          break;
        } else {
          if (state != 1) {
            inData += c;
          }
        }
    }

    if ( (millis() - start_time) > timeout ) 
    {
      state = 2;
      //Serial.println ("TimedOut");
    }
  }
  inData.trim();
  if ((state = 1)) flush(timeout);
  return inData;
}
于 2013-08-03T23:33:42.600 に答える