我现在正在使用Arduino UNO和HC-05蓝牙模块。我按照此链接上的说明进行接线。因此,使用此HC-05模块有两种工作模式


简单的串行通信
以AT指令模式工作以更改HC-05模块的参数
/>
,只要我在简单的串行通讯模式下工作,一切都可以正常工作,但是当我尝试更改模块的参数时,它却无法正常工作。为了在At command模式下工作,HC-05模块的PIN NO 34必须很高,我已经照顾好了。最近,我发现在mu模块中他们故意没有将Berg板连接到PIN 34,因此即使我无法更改模块的参数以及在arduino IDE的COM端口上编写任何命令时,我也直接连接了PIN。 ,我得到此响应

Enter AT commands:
ERROR:(0)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿýì¢^
ERROR:(0)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿýì¢^
ERROR:(0)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿýì¢^
ERROR:(0)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿýì¢^
ERROR:(0)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿýì¢^
ERROR:(0)
ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿõÿýì¢^


我认为垃圾归因于我的代码

这是我的代码:

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(10, 11); // RX | TX

void setup()
{
  pinMode(9, OUTPUT);  
  digitalWrite(9, HIGH);
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
  BTSerial.begin(38400);  
}

void loop()
{
  uint8_t x;
  char CommandFromSerial[50]=" ";
  char ResponseFromBluetooth[50]= " ";

  if ((Serial.available())){
    if(Serial.available()>0){
      for(x=0;x<50;x++)
        CommandFromSerial[x]=Serial.read();
      BTSerial.println(CommandFromSerial);
    }
  }

  if ((BTSerial.available())){
    if(BTSerial.available()>0)
      for(x=0;x<50;x++)
        ResponseFromBluetooth[x]=BTSerial.read();
    Serial.println(ResponseFromBluetooth);
  }
}


我无法弄清楚自己在做什么错。我在COM端口上使用了此命令
AT\r\n和许多其他命令,但是每次得到相同的响应时。

是否在不知不觉中弄乱了我的蓝牙模块?

评论

我根据花括号正确缩进了您的代码。由于最初的缩进是相当落后的,请看一下是否正确以及您的意图。

我怀疑SoftwareSerial标头。您是否可以将COM端口直接连接到BT设备,然后会收到什么样的响应?

我在Arduino Uno上使用了imjosh的代码和连接图,并且与模块通信,但仍然无法更改波特率(错误(0))。有些事情仍然无法控制;如果有发现,请分享。为了清楚起见,我粘贴了串行输出:at at at + version + VERSION:2.0-20100601 OK at + baud错误:(0)AT + BAUD8错误:(0)

错误(0)通常与错误的命令相关联

#1 楼

我遇到了同样的问题。我终于解决了问题。本文档说,在AT模式下发送内容后,必须放置CR LF(\ r \ n)字符。但是在您使用的arduino代码中,使用Serial.write命令发送命令。但是,Serial.write命令不会放入CR LF字符。所以我用Tera Term发送命令。首先将PIN34连接至3.3V。为arduino供电,并上传以下代码。开放Tera条款。开始新的串行连接。选择您的arduino的串行端口。然后单击设置>终端。将发送更改为CR + LF,然后选中本地回声复选框。现在,您可以发送AT命令。





#include <SoftwareSerial.h>

SoftwareSerial BTSerial(2, 3); // RX | TX

void setup()
{
  pinMode(9, OUTPUT);  // this pin will pull the HC-05 pin 34 (key pin) HIGH to switch module to AT mode
  digitalWrite(9, HIGH);
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
  BTSerial.begin(38400);  // HC-05 default speed in AT command more
}

void loop()
{

  // Keep reading from HC-05 and send to Arduino Serial Monitor
  if (BTSerial.available())
    Serial.write(BTSerial.read());

  // Keep reading from Arduino Serial Monitor and send to HC-05
  if (Serial.available())
    BTSerial.write(Serial.read());
}


#2 楼

不会以为您弄乱了蓝牙模块,或者代码有问题;
我也遇到了使那些HC-05“ linvor”模块响应AT命令集的问题。如果模块仅响应AT命令并设置名称;那么你有一个从模块。这些已加载了有限的固件,​​无法响应给定的其他AT命令。
您需要的是主人的,因为它们会响应其他AT命令并在其上安装更好的固件。

通过反复试验发现了这一点,因为我有2个模块试图进行配置,以便他们配对而无需用户干预和失败。我在eBay上从卖家那里购买了模块,其ID为emailforyou,说明中提供了很好的信息;这告诉我,为了使每个模块配对,您需要一个主从设备。我购买了2个表面贴装母版,但还选择了上述卖方的6针(组装)HC-06母版/从属模块。更新了

#include <SoftwareSerial.h>

SoftwareSerial BTSerial(16, 17); // RX | TX

void setup()
{
  pinMode(11, OUTPUT);  // this pin will pull the HC-05 pin 34 (key pin) HIGH to switch module to AT mode
  digitalWrite(11, HIGH);
  Serial.begin(9600);
  Serial.println("Enter AT commands:");
  BTSerial.begin(9600);  // HC-05 default speed in AT command more
                         // was 38400 but changed it to 9600
}

void loop()
{

  // Keep reading from HC-05 and send to Arduino Serial Monitor
  if (BTSerial.available())
    Serial.write(BTSerial.read());

  // Keep reading from Arduino Serial Monitor and send to HC-05
  if (Serial.available())
    BTSerial.write(Serial.read());
}


评论


$ \ begingroup $
这是一个很好的信息。所以,这意味着要更改模块的某些参数,我需要拥有一个主模块,然后只有我才能更改该模块的名称和配对密码。我还发现一件事,就是HC-05模块的RX / TX引脚具有3.3伏特的电压,而Arduino的RX / Tx引脚具有5伏特的电压。所以我想我需要尝试一下分压器,让我们看看是否有任何事情发生。
$ \ endgroup $
–hailendra
13年11月13日在10:07

$ \ begingroup $
关于3.3v是正确的,因为组装的完整模块具有3.3v稳压器,因此只能响应5V输入。 HC-05主模块看起来与从模块相同。上面提到的卖方使用白色标记来表示哪个。
$ \ endgroup $
–OricTosh
13年11月13日在10:26

$ \ begingroup $
是的,但是如果完整的组装模块带有板载3.3 V稳压器。正如我在模块背面看到的那样,它清楚地写在RX / TX引脚3.3 V上,所以我将尝试使用稳压器和看看是否能解决这个问题,因为到目前为止,我能够进入At命令模式,但是我得到的响应为ERROR:(0),这是错误的AT命令错误响应代码。因此,RX / TX可能为5V的Arduino正在玩游戏并弄乱了从Arduino发送的命令
$ \ endgroup $
–hailendra
13年11月13日在10:42

$ \ begingroup $
查看您的代码和对我有用的代码,可能是由于波特率不正确造成的。语句BTSerial.begin(38400)应该为9600。不知道为什么会与我阅读的内容背道而驰,但却给了我可读的答复。
$ \ endgroup $
–OricTosh
13年11月13日在10:52



$ \ begingroup $
Tosh:波特率38400是在AT命令模式下工作时的默认波特率。我很想知道代码对您有用吗,您是否能够使用Arduino IDE的串行端口更改模块的参数如果您可以通过屏幕截图或文本输出与我分享一些信息,我会很高兴。
$ \ endgroup $
–hailendra
13年11月13日在10:56



#3 楼

我遇到了同样的问题,因此请尝试使用以下代码,但在串行监视器中使用IDE 1.0.0和波特率38400:

void setup() {
  Serial1.begin(38400);
  Serial.begin(38400);
}

void loop() {
  if(Serial1.available())
  {
    byte a=Serial1.read();
    Serial.write(a);
  }
  if(Serial.available())
  {
    byte a=Serial.read();
    Serial1.write(a);
  }
}


#4 楼

由于模块以9600波特的速度运行,因此您将产生垃圾。为了使模块以38400的波特率运行,必须在模块加电之前将引脚34设置为高电平。似乎您正在尝试将Setup()中的引脚设置为高电平,但到那时已经为时已晚。

编辑:我现在看到他将34针硬接线为高,并且他正在从模块中读取回有效数据。如果需要一种方法来确保模块的波特率,则仍然可以使用以下修复程序。

您可以通过以下几种方法进行修复:


使用9600将代码中的波特率
直接将vcc连接到引脚34,因此始终处于38400波特率模式下
使用执行此操作的AT命令更改默认uart速度(不记得了)
-05将RESET引脚设置为Arduino输出引脚,因此您可以将引脚34设置为高电平,然后切换复位状态,以确保模块进入38400模式。

编辑:假设您已正确连接所有设备且波特率如果速率设置正确,则以下代码可在Arduino Uno上正常工作。

/* Serial Loop */

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 9

SoftwareSerial mySerial(rxPin, txPin); // RX, TX
char myChar;

void setup() {
  Serial.begin(9600);   
  Serial.println("AT");

  mySerial.begin(38400);
  mySerial.println("AT");
}

void loop() {
  while (mySerial.available()) {
    myChar = mySerial.read();
    Serial.print(myChar);
  }

  while (Serial.available()) {
    myChar = Serial.read();
    Serial.print(myChar); //echo
    mySerial.print(myChar);
  }
}


这是该代码附带的电路。标记为“ Key”的引脚是引脚34。

评论


$ \ begingroup $
再看一下他的代码-9600波特硬件串行端口仅用于(可能)与其计算机进行通信,而不是与BT设备进行通信。蓝牙通过38400上非硬件串行引脚上的软件串行来运行。只要在38400写入BT之前完全引入Serial(9600)命令,就不会有问题。
$ \ endgroup $
–emc
2014年6月7日在18:25

$ \ begingroup $
假设BT设备的运行速度为38400,那您是对的。我以为不是,但是现在我看到他至少正在正确地阅读“ ERROR(0)”作为证据,并且他确实将34针固定为高电平。 TX信号或代码有问题。
$ \ endgroup $
– imjosh
2014年6月9日19:42

$ \ begingroup $
我认为HC-05默认在38400上连接,但是他很可能已经更改了配置。我也对SoftwareSerial.h通讯感到怀疑。
$ \ endgroup $
–emc
2014年6月9日在23:07

$ \ begingroup $
如果引脚34在上电时为高电平,则波特率保证为38400。如果引脚34在加电时为低电平,则默认情况下它将变为9600,如果uart设置已更改,则默认为9600。请参阅从第一页底部开始的本文档:instructionables.com/files/orig/FOR/4FP2/HKZAVRT6/…-SoftwareSerial在低波特率(9600)下也可以正常工作。只要连接良好且电线不太长,它就可以在38400下相当可靠地工作。以较高的速率,您可能会开始丢失数据或出错。
$ \ endgroup $
– imjosh
2014年6月10日15:16

#5 楼

我在使用Pro Micro时也遇到了问题。改为使用Mega进行测试,并且没有问题,对于Serial1使用(57600),对于Serial1使用(38400)。我确实在Pro Micro上尝试了Serial1以及BTSerial,但无济于事,但没有在Mega上使用BTSerial进行测试。

Pro Micro上没有引脚11,所以我使用了

SoftwareSerial BTSerial(10,14);

无论出于何种原因,在尝试使用Mega之后,它现在都可以使用上述John的代码与Pro Micro一起使用,与我最初使用的代码(适用于Mega)。

我发现“无效设置”部分中的Serial.println命令不适用于Pro Micro,但适用于Mega ,所以不要以为它没有作用就是因为您没有在串行监视器中看到它们。在“无效循环”部分,它们可以正常工作。使用命令等待Serial准备就绪并没有什么不同,例如:

   Serial.begin(57600);
   while (!Serial) {
     ; // wait for serial port to connect. Needed for Leonardo only
   }

   Serial.println("Goodnight moon!");

   // set the data rate for the SoftwareSerial port
   Serial1.begin(38400);
   Serial.println("Ready");
}


#6 楼

以HC05模块为例:您可以使用Arduino IDE,但不要忘记在波特率选择附近(在硬件串行监视器中)选择“ NL和CR两者”。

HC06模块的情况:选择“无行结束”

;)

使用此代码可以:

    #include <SoftwareSerial.h>

SoftwareSerial BTSerial(10, 11); // RX | TX

void setup()
{
  pinMode(9, OUTPUT);  //HC-05 pin 34 (key pin) 
  digitalWrite(9, HIGH);  // 5V sur Key pour activer le mode commande AT
  Serial.begin(9600);
  Serial.println("AT commandes:");
  BTSerial.begin(38400);  // HC-05 vitesse par défaut pour la commande AT
}

void loop()
{
  // lecture des commandes AT par le serial port(9600)
  if (BTSerial.available()) Serial.write(BTSerial.read());

  // envoie à HC-05 de commandes AT saisi
  if (Serial.available()) BTSerial.write(Serial.read());
}


#7 楼

https://juangiraldo0.blogspot.com/2018/07/configuracion-modulo-bluetooth-hc-06.html

您的错误(0)可能是由于versión固件问题
版本3.0-20170609有AT指令的差异