Arduino:使用串行和软件串口与蓝牙模块

时间:2013-08-22 09:24:39

标签: android bluetooth serial-port arduino

我的目的是使用Arduino使用HC-05蓝牙模块在PC和Android设备之间建立通信。

我使用PC和Arduino(串行监视器)之间的USB通信和SoftwareSerial连接到HC-05。

我的问题是,从BT到PC的通信运行良好,但在其他方面无法正常工作。当从PC发送到BT时,只有当我关闭PC上的串行监视器或重置Arduino时,BT设备才会收到所有发送的字符。

我已经排除了BT模块或Android应用程序的问题,因为如果在Arduino中我实现了“ECHO”代码(在Android中编写并在Android中发送)一切正常。

在下面发布的Arduino代码预期的行为是:Arduino reset-> Hello word发送,Serial monitor打开 - >没有任何反应,字符写在串行监视器上 - >在BT上收到的字符,写在BT上的字符>在串行监视器上接收的字符,串行监视器关闭 - >没有任何反应。

真正的行为是:Arduino重置 - > Hello word发送,Serial monitor打开 - > 2 BT上的Hello字和PC上的1(“晚安”),写在串行监视器上的字符 - >没什么,写在BT-上的字符>在串行监视器上接收的字符,串行监视器关闭 - >收到串行监视器中的先前书写字符+ Hello Word。

如何解决此问题?

代码:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int a=0;
char c;
char d;
void setup() {
  Serial.begin(9600);
  Serial.println("Goodnight moon!");
  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}
void loop() {
  delay(10);
  if (Serial.available()) {
    c=Serial.read();
    delay(10);
    Serial.write(c);
  }
  delay(10);
  if (mySerial.available()) {
    d=mySerial.read();
    delay(10);
    mySerial.write(d);

  }
}

6 个答案:

答案 0 :(得分:3)

此代码适用于使用HC-05的Arduino Mini Pro(应与UNO相同)。我把HC-05与我的笔记本电脑配对。在与HC-05和Arduino串行控制台关联的COM端口上使用HyperTerminal,我可以双向发送消息。 Serial.println语句显示在Hyperterminal窗口中,就像它们应该的那样。

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 7

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

void setup() {
  Serial.begin(9600);   
  Serial.println("Goodnight moon!");

  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

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

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

答案 1 :(得分:2)

我已经在Arduino Uno和PC之间实现了串行通信,这是我的代码,希望它可以提供帮助:

int data;
char character;
int start_flag = 0;

void setup() {
  Serial.begin(921600); 
  pinMode(2, OUTPUT); 
}
void loop() {
  if(Serial.available() > 0){
    character = (char) Serial.read();
    if(character == 's') {
      start_flag = 1;
    }
    if(character == 't') {
      start_flag = 0;
    }
  }
  if (start_flag == 1) {
    Serial.print(data); //data that was acquired by internal ADC
  }
}

答案 2 :(得分:0)

您可以尝试this。这是关于测试Arduino bluetooth时可以使用的最简单的代码&lt; - &gt; C#沟通。注意:通过连接PIN1(TX)&lt; - &gt;来测试代码。 MODULE RX,PIN2(RX)&lt; - &gt; MODULE TX并将PIN1(TX)5V分压至2.5V,然后再送入模块。

希望这有助于所有尝试此事的人!

答案 3 :(得分:0)

使用此串行设置。使用此代码,我可以从串行监视器

接收并向蓝牙发送日期
void setup(){
  Serial.begin(9600); // Begin the serial monitor at 9600bps
  bluetooth.begin(115200); // The Bluetooth Mate defaults to 115200bps
  bluetooth.print("$"); // Print three times individually
  bluetooth.print("$");
  bluetooth.print("$"); // Enter command mode
  delay(100); // Short delay, wait for the Mate to send back CMD
  bluetooth.println("U,9600,N"); // Temporarily Change the baudrate to 9600, no parity
  // 115200 can be too fast at times for NewSoftSerial to relay the data reliably
  bluetooth.begin(9600); // Start bluetooth serial at 9600
  pinMode(led, OUTPUT);
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
}

有关详细信息,请访问 http://www.circuitmagic.com/arduino/arduino-and-bluetooth-hc-06-to-control-the-led-with-android-device/

答案 4 :(得分:0)

我建议使用此应用进行测试:

https://play.google.com/store/apps/details?id=com.vagoscorp.virtualterminal

它允许您查看和发送字节作为字节(数字从0b00000000到0b11111111(0到255十进制)) 所以你可以制作一个简单的echo固件来测试你的波特率是否正确并且工作正常,开始发送命令来打开/关闭某些LED

这是一个回音代码示例:

$url="http://www.agoda.com/world.html";
$html=file_get_contents($url);


$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath0 = new DOMXPath($dom);
$locs = $xpath0->evaluate("//a");


for ($x = 0; $x < 20; $x++) {

$location=$locs->item($x)->nodeValue;
$locationurl="http://www.agoda.com".$locs->item($x)->getAttribute('href');

print("$x. $location,$locationurl<br />");
}   

我希望它可以帮到你

答案 5 :(得分:0)

出现同样的问题,您必须在有线侧和无线电侧将BT模块视为2种不同的波特率。无线电侧通过腻子连接的任何一个设置,有线侧通过AT命令编程。 HC-05默认为38400。