6
votes

My purpose is to use Arduino to set up communication between a PC and an Android device using an HC-05 bluetooth module.

I use the USB communication between the PC and the Arduino (Serial Monitor) and a SoftwareSerial to connect to the HC-05.

My problem is that the communication works well from BT to the PC, but doesn't work as expected in the other way. When sending from the PC to BT all the characters sent are received by the BT device only when I close the Serial Monitor on the PC or when I reset the Arduino.

I've excluded a problem with the BT Module or the Android application because if in Arduino I implement an "ECHO" code (write in Android and the send in Android) everything works fine.

With the Arduino code posted below the expected behaviour is: Arduino reset-> Hello word sent, Serial monitor opened-> nothing happens, character written on serial monitor-> character received on BT, character written on BT-> character received on Serial Monitor, Serial monitor closed-> nothing happens.

The real behaviour is: Arduino reset-> Hello word sent, Serial monitor opened-> 2 Hello word on BT and 1 ("goodnight") on PC, character written on serial monitor-> nothing, character written on BT-> character received on Serial Monitor, Serial monitor closed-> previous written character(s) in serial monitor received + Hello Word.

How can I fix this problem?

Code:

#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
Have you tried using different pins for the softwareserial? Not all pins are supported depending on which board you are using: arduino.cc/en/Reference/SoftwareSerialuser2461391
Thank you for your suggestion, I am using an Arduino Uno so there shouldn't be any problem but I tried it anyway, same result. Note that sending and receiving only through BT works, the problem occurs only when using USB Serial Port side by side with BT.user2706612
Have you tried different baudrates? Are you using the right port in the Arduino IDE?ladislas
"my purpose is to use Arduino to set up a communication between PC and an Android device using a HC-05 bluetooth module" You do realize that this large and ungainly solution is going to cost several times what a USB bluetooth dongle would?Chris Stratton
That's the "low level" purpose, I want to do it as a first step in order to later being able to activate motors and send data from sensors from/to both Android and PC.user2706612

6 Answers

4
votes

This code is working for me on an Arduino Mini Pro (should be the same as UNO) with an HC-05. I have the HC-05 paired with my laptop. Using HyperTerminal on the COM port associated with the HC-05 and the Arduino serial console, I can send messages bidirectionally. The Serial.println statements show up in the Hyperterminal window like they should.

#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);
  }
}
2
votes

I have implemented a serial communication between Arduino Uno and PC and this was my code, hope it can help:

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
  }
}
0
votes

You could try this. It's about the simplest code you can use when testing Arduino bluetooth <-> C# communication. Note: the code was tested by connecting PIN1(TX) <-> MODULE RX, PIN2(RX) <-> MODULE TX and dividing the PIN1(TX) 5V to 2,5V before feeding it to the module.

Hope this helps all that are trying this!

0
votes

Use this serial setup. With this code I can receive and send date to bluetooth from Serial Monitor

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);
}

For more information, visit http://www.circuitmagic.com/arduino/arduino-and-bluetooth-hc-06-to-control-the-led-with-android-device/

0
votes

I recommend to use this app for testing:

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

It let you see and send bytes as bytes(number from 0b00000000 to 0b11111111 (0 to 255 in decimal)) so you can make a simple echo firmware to test if your baudrate is correct and with that working, begin sending commands to turn on/off some LEDs

this is an echo code example:

char dato = 0;

void setup() {
 Serial.begin(9600);//9600 is the default baudrate of the HC-05 (you can change it by AT commands, google it if you want)
 //pinMode(13, OUTPUT); //enable this pin if you want to use de LED idea
 //digitalWrite(13,  HIGH);
}
//////////////////////////////////////////////////////////////////////////
void serialEvent() {  //if you have received serial data
    while (Serial.available() > 0) {
        char dato = (byte)Serial.read();//save the byte
        Serial.write(dato);//send the just received byte (echo)
    }
}
///////////////////////////////////////////////////////////////////////////
void loop() {

}

I hope it helps you

0
votes

Had the same problem, you have to view the BT module as 2 different baud rates on the wired side and the radio side. The radio side is set by whatever you connect at through putty, the wired side is programmed via AT commands. HC-05 defaults at 38400.