感谢您查看我的问题。
我的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相互连接。
有没有人有类似的问题?
此致
杰米
我管理了解问题是什么,并希望分享。 当模块处于命令模式并允许您输入“$$$”时,如果您尝试向其发送大量数据,蓝牙模块将重置。这本小册子很简单:
注意:该模块支持快速数据模式。在此模式下,即使模块收到$$$,模块也不会进入命令模式。如果未在配置窗口(60秒)内进入命令模式,模块将进入快速数据模式。
因为我一直在使用命令模式,它永远不会进入快速数据模式。 我现在将Command Timeout设置为5秒,所以如果我需要使用它,我只需重置模块。
答案 0 :(得分:0)
我使用以下自制的库与Serial3上的RN42通信。注意我有一个50ms的延迟,允许它在:: begin()期间稳定。在此之后,我只使用Serial3.Print或Read。更改Serial#和Pins以符合您的需求。
#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;
}