RN42蓝牙重启/重置与快速数据传输



谢谢你看我的问题。

我的RN42蓝牙模块有这个问题,如果我每秒只发送少量数据,比如打印"Hello World"。如果我使用这个代码:

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相互连接。

有人遇到过类似的问题吗?

问候

Jamie

我设法弄清楚问题出在哪里,并想与大家分享。当模块处于命令模式并允许您输入"$$$"时,如果您试图向蓝牙模块发送大量数据,蓝牙模块将重置。它在小册子上的一个小纸条上:

注意:该模块支持快速数据模式。在这种模式下,即使模块收到$$$,它也不会进入命令模式。如果您没有在配置窗口(60秒)内进入命令模式,模块将进入快速数据模式。

由于我在任何时候都使用命令模式,它永远不会进入快速数据模式。我现在已经将命令超时设置为5秒,所以如果我需要使用它,我只需重置模块。

我使用以下自制库与Serial3上的RN42进行对话。请注意,我有一个50ms的延迟,以允许它在::begin()期间稳定。之后,我只使用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("vn", 'n', DEFAULT_FLUSH_TIMEOUT);
  read_serial = command("GBn", 'n', DEFAULT_FLUSH_TIMEOUT);
  read_connection = command("GKn", '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;
}

最新更新